genoverse 4.0.7 → 4.0.9-alpha

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/LICENSE.TXT CHANGED
@@ -1,4 +1,6 @@
1
- Copyright (c) 2011 Genome Research Ltd.
1
+ Copyright (c) 2011-2023 Genome Research Ltd.
2
+ Copyright (c) 2023 EMBL-European Bioinformatics Institute
3
+
2
4
  Author: Simon Brent, Evgeny Bragin
3
5
 
4
6
  Redistribution and use in source and binary forms, with or without
@@ -8,11 +10,11 @@ this list of conditions and the following disclaimer.
8
10
  2. Redistributions in binary form must reproduce the above copyright
9
11
  notice, this list of conditions and the following disclaimer in the
10
12
  documentation and/or other materials provided with the distribution.
11
- 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger
13
+ 3. Neither the names of the copyright holders, the Wellcome Sanger
12
14
  Institute nor the names of its contributors may be used to endorse or promote
13
15
  products derived from this software without specific prior written permission.
14
16
 
15
- THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS IS" AND
17
+ THIS SOFTWARE IS PROVIDED THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16
18
  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
19
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
20
  DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH LTD OR CONTRIBUTORS BE LIABLE
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Genoverse [![Build Status](https://github.com/WTSI-decipher-grp/Genoverse/actions/workflows/test.yml/badge.svg)](https://github.com/WTSI-decipher-grp/Genoverse/actions)
1
+ # Genoverse [![Build Status](https://github.com/DECIPHER-genomics/Genoverse/actions/workflows/test.yml/badge.svg)](https://github.com/DECIPHER-genomics/Genoverse/actions)
2
2
 
3
3
  Genoverse is a portable, customizable, back-end independent JavaScript and HTML5 based genome browser which allows the user to explore data in a dynamic and interactive manner.
4
4
 
@@ -6,11 +6,11 @@ Data is visualized in the browser, meaning Genoverse can be installed on any web
6
6
 
7
7
  Genoverse works with a variety of formats, such as JSON, BED, BAM, VCF, GFF, delimited text files, or XML, and can be customized to parse and display any data source as required.
8
8
 
9
- Genoverse works using a system of [tracks](https://github.com/WTSI-decipher-grp/Genoverse/wiki/Tracks) - essentially horizontal sections of the genome browser which display [features](https://github.com/WTSI-decipher-grp/Genoverse/wiki/Features) - genes, variants, etc. with defined genomic start and end points. Each track has its own data set stored in a [model](https://github.com/WTSI-decipher-grp/Genoverse/wiki/Genoverse.Track.Model-functions), a method for displaying that data, stored in a [view](https://github.com/WTSI-decipher-grp/Genoverse/wiki/Genoverse.Track.View-functions), and a [controller](https://github.com/WTSI-decipher-grp/Genoverse/wiki/Genoverse.Track.Controller-functions) to manage the creation of DOM elements, and user interactions with them.
9
+ Genoverse works using a system of [tracks](https://github.com/DECIPHER-genomics/Genoverse/wiki/Tracks) - essentially horizontal sections of the genome browser which display [features](https://github.com/DECIPHER-genomics/Genoverse/wiki/Features) - genes, variants, etc. with defined genomic start and end points. Each track has its own data set stored in a [model](https://github.com/DECIPHER-genomics/Genoverse/wiki/Genoverse.Track.Model-functions), a method for displaying that data, stored in a [view](https://github.com/DECIPHER-genomics/Genoverse/wiki/Genoverse.Track.View-functions), and a [controller](https://github.com/DECIPHER-genomics/Genoverse/wiki/Genoverse.Track.Controller-functions) to manage the creation of DOM elements, and user interactions with them.
10
10
 
11
11
  Tracks can have multiple models and views, which allows for switching between displays at different zoom levels. An example of this would be a track where you show genes when looking at a large region of a chromosome, and then switch to showing transcripts as the user zooms in.
12
12
 
13
- In addition to this, Genoverse has a set of [plugins](https://github.com/WTSI-decipher-grp/Genoverse/wiki/Plugins), which allow additional functionality beyond the core genome browser. These include a control panel for adding and removing tracks, and interacting with the browser more easily, a way to add controls to each individual track, and a way to enable drag and drop of local data files onto the genome browser.
13
+ In addition to this, Genoverse has a set of [plugins](https://github.com/DECIPHER-genomics/Genoverse/wiki/Plugins), which allow additional functionality beyond the core genome browser. These include a control panel for adding and removing tracks, and interacting with the browser more easily, a way to add controls to each individual track, and a way to enable drag and drop of local data files onto the genome browser.
14
14
 
15
15
  ## Installation
16
16
 
@@ -42,7 +42,7 @@ const genoverse = Genoverse.jQuery(container).data('genoverse');
42
42
 
43
43
  By default, the Genoverse distribution in created with [Babel](https://babeljs.io/) and certain [polyfills](https://github.com/zloirock/core-js/blob/master/README.md), in order to support old web browsers like Internet Explorer 11.
44
44
 
45
- If you want to create your own distribution bundle, see `devDependencies` in [package.json](https://github.com/WTSI-decipher-grp/Genoverse/blob/master/package.json) for Webpack/Babel packages you need to install in order to be able to do so.
45
+ If you want to create your own distribution bundle, see `devDependencies` in [package.json](https://github.com/DECIPHER-genomics/Genoverse/blob/master/package.json) for Webpack/Babel packages you need to install in order to be able to do so.
46
46
 
47
47
  Once these dependencies are installed, distributions can be built with [webpack-cli](https://webpack.js.org/api/cli/).
48
48
 
@@ -179,4 +179,4 @@ new Genoverse({
179
179
  });
180
180
  ```
181
181
 
182
- See [index.html](https://github.com/WTSI-decipher-grp/Genoverse/blob/master/index.html) for example configuration, or the [documentation](https://github.com/WTSI-decipher-grp/Genoverse/wiki/Genoverse-configuration) for more details about configuration properties.
182
+ See [index.html](https://github.com/DECIPHER-genomics/Genoverse/blob/master/index.html) for example configuration, or the [documentation](https://github.com/DECIPHER-genomics/Genoverse/wiki/Genoverse-configuration) for more details about configuration properties.
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkgenoverse=self.webpackChunkgenoverse||[]).push([[804],{1804:function(t,e,a){a.r(e);var n=a(4394);e.default={controlPanel:function(t){var e=this.jQuery;this.controls=[{name:"Scroll left and right by pressing and holding these buttons",buttons:[{name:"Scroll left",icon:'<i class="fas fa-chevron-left"></i>',class:"gv-scroll-left"},{name:"Scroll right",icon:'<i class="fas fa-chevron-right"></i>',class:"gv-scroll-right"}],init:function(t){var a=e(this);a.find(".gv-scroll-left, .gv-scroll-right").on({mousedown:function(){t.startDragScroll()},mouseup:function(){t.stopDragScroll()}}),a.find(".gv-scroll-left").mousehold(50,(function(){t.move(t.scrollDelta)})),a.find(".gv-scroll-right").mousehold(50,(function(){t.move(-t.scrollDelta)}))}},{name:"Zoom-in and zoom-out",buttons:[{name:"Zoom in",icon:'<i class="fas fa-search-plus"></i>',class:"gv-zoom-in",action:function(t){t.zoomIn()}},{name:"Zoom out",icon:'<i class="fas fa-search-minus"></i>',class:"gv-zoom-out",action:function(t){t.zoomOut()}}]},{name:"Toggle your mouse drag action between scroll left/right and select region",buttons:[{name:"Mouse drag action to scroll the browser left or right",icon:'<i class="fas fa-arrows-alt-h"></i>',class:"gv-drag-scroll",action:function(t){t.setDragAction("scroll"),e(this).addClass("gv-active").siblings().removeClass("gv-active")}},{name:"Mouse drag action to select a region",icon:"<i></i>",class:"gv-drag-select",action:function(t){t.setDragAction("select"),e(this).addClass("gv-active").siblings().removeClass("gv-active")}}],init:function(t){e(this).find(".gv-drag-".concat(t.dragAction)).addClass("gv-active").siblings().removeClass("gv-active")}},{name:"Toggle your mouse wheel action between zoom in/out and default page scroll",buttons:[{name:"Mouse wheel action to scroll the page up and down",icon:'<i class="fas fa-arrows-alt-v"></i>',class:"gv-wheel-off",action:function(t){t.setWheelAction("off"),e(this).addClass("gv-active").siblings().removeClass("gv-active")}},{name:"Mouse wheel to zoom in and out",icon:"&#177;",class:"gv-wheel-zoom",action:function(t){t.setWheelAction("zoom"),e(this).addClass("gv-active").siblings().removeClass("gv-active")}}],init:function(t){e(this).find(".gv-wheel-".concat(t.wheelAction)).addClass("gv-active").siblings().removeClass("gv-active")}}],this.saveable&&this.controls.push({icon:'<i class="fas fa-undo"></i>',name:"Reset tracks and configuration",action:function(t){t.resetConfig()}}),this.on({beforeInit:function(){var t=this,a=this;this.tracksLibrary=(this.tracksLibrary||this.tracks).map((function(e){return t.normaliseTrackDefinition(e)})).filter((function(t){return t.prototype.name}));var n=e('\n <table cellspacing=0 cellpadding=0 class="gv">\n <tr>\n <td class="gv-panel gv-panel-left"></td>\n <td class="gv-canvas-container"></td>\n <td class="gv-panel gv-panel-right"></td>\n </tr>\n </table>\n ').appendTo(this.container).find(".gv-panel-right");this.controlPanel=n,this.superContainer=this.container,this.container=e(".gv-canvas-container",this.container),a.controls.forEach((function(t){var n=e('<div class="gv-button-set">').attr("title",t.name).appendTo(a.superContainer.find(".gv-panel-right"));(t.buttons||[t]).forEach((function(i){var s=e("<button>".concat(i.icon,"</button>")).addClass(i.class).attr("title",i.name).appendTo(n);i.action&&s.on("click",(function(){i.action.call(s[0],a)})),i.init&&i!==t&&i.init.call(s[0],a)})),t.init&&t.init.call(n,a)})),this.superContainer.width(this.width),e(document).on("keydown",(function(t){27===t.keyCode&&(n.find("button.gv-drag-select").hasClass("gv-active")&&n.find("button.gv-drag-scroll").trigger("click"),e(".gv-menu .gv-close").trigger("click"))}))},afterInit:function(){var a=this,n=e('<button class="gv-tracks-library-button" title="Tracks menu"><i class="fas fa-bars"></i> Tracks</button>').on("click",(function(){var n=this,i=function t(e,a){var n,i;return null!==(n=e.constructor)&&void 0!==n&&null!==(i=n.ancestor)&&void 0!==i&&i.prototype?t(e.constructor.ancestor.prototype,a.concat(e.constructor.ancestor.prototype.tags||[])):a};if(e(this).hasClass("gv-active"))e(".gv-menu.gv-tracks-menu .gv-close").trigger("click"),e(this).removeClass("gv-active");else{var s=e(this).data("menu");if(s)s.show();else{var o;s=a.makeMenu({"Currently enabled tracks:":"Available tracks:",'<div class="gv-current-tracks"></div>':'<input placeholder="Search"><div class="gv-available-tracks"></div>'}).addClass("gv-tracks-menu"),e("input[placeholder=Search]",s).on("keyup",(function(){var t=this.value.toLowerCase();e(".gv-tracks-library-item",s).each((function(){var a=e(this).data("track"),n=!1;a.name&&a.name.toLowerCase().indexOf(t)>=0?n=!0:i(a,[]).concat(a.tags||[]).some((function(e){return e.toLowerCase().indexOf(t)>=0}))&&(n=!0);e(this)[n?"removeClass":"addClass"]("gv-hide")})),e(".gv-tracks-library-category",s).each((function(){var t=e(this).children(".gv-tracks-library-item:not(.gv-hide)");e(this)[t.length?"removeClass":"addClass"]("gv-hide")}))})),e(".gv-close",s).on("click",(function(){e(n).removeClass("gv-active")}));var r=e(".gv-available-tracks",s),c=e(".gv-current-tracks",s).before('<div class="gv-current-tracks-instructions">Drag and drop to reorder</div>').data({reload:function(){e(this).empty().data("listTracks")()},listTracks:function(){a.tracks.filter((function(t){return t.name&&!(!1===t.removable&&t.unsortable)&&!t.parentTrack&&!t.lockToTrack})).forEach((function(t){var a=e('<div class="gv-tracks-menu-track">').append('<span class="gv-tracks-menu-track-name" title="'.concat(t.name,'">').concat(t.defaultName,"</span>")).appendTo(c).data("track",t).addClass(t.unsortable?"gv-unsortable":"");!1===t.removable?a.prepend('<i class="gv-remove-track gv-menu-button fas fa-circle">'):a.prepend(e('<i class="gv-remove-track gv-menu-button fas fa-times-circle">').on("click",(function(){t.remove()})));var n=a.find(".gv-tracks-menu-track-name").tipsy({gravity:"w",trigger:"manual"}).on("mouseenter",(function(){var t=e(this).tipsy("show").data("tipsy").$tip;t&&t.css("zIndex",1002)})).on("mouseleave",(function(){e(this).tipsy("hide")}));t.name===t.defaultName&&n.tipsy("disable")}))}}).sortable({items:"div:not(.gv-unsortable)",cursor:"move",axis:"y",handle:"span",update:a.updateTrackOrder.bind(a),start:function(){c.find(".gv-tracks-menu-track-name").each((function(){e(this).tipsy("hide").tipsy("disable")}))},stop:function(){c.find(".gv-tracks-menu-track-name").each((function(){e(this).tipsy("enable")}))}});if(c.data("listTracks")(),a.saveable&&e('<div class="gv-tracks-menu-reset gv-menu-button"><i class="fas fa-undo"></i> Reset tracks and configuration</div>').insertAfter(c).on("click",(function(t){t.preventDefault(),a.resetConfig()})),null!==(o=a.tracksLibrary)&&void 0!==o&&o.length){var l=a.tracksLibrary.filter((function(t){return t.prototype.name&&!1!==t.prototype.removable})).reduce((function(t,e){var a=e.prototype.category||"";return t[a]=t[a]||[],t[a].push([e.prototype.name.toLowerCase(),e]),t}),{}),d=((null==t?void 0:t.tracksLibraryCategoryOrder)||[]).reduce((function(t,e,a){return Object.assign(t,(s=a+1,(i=e)in(n={})?Object.defineProperty(n,i,{value:s,enumerable:!0,configurable:!0,writable:!0}):n[i]=s,n));var n,i,s}),{});Object.keys(l).sort((function(t,e){return Boolean(e)-Boolean(t)||d[t]-d[e]||t.localeCompare(e)})).forEach((function(t,n,i){var s=i.length>1?e('<div class="gv-tracks-library-category">').append(e('<div class="gv-tracks-library-category-header">').html(t||"Other")).appendTo(r):r;l[t].sort((function(t,e){return t[0].localeCompare(e[0])})).forEach((function(t){var n=t[1];e('<div class="gv-tracks-library-item">').append(e('<i class="gv-add-track gv-menu-button fas fa-plus-circle">').on("click",(function(){a.trackIds=a.trackIds||{},a.trackIds[n.prototype.id]=a.trackIds[n.prototype.id]||1,a.addTrack(n.extend({id:"".concat(n.prototype.id).concat(a.tracksById[n.prototype.id]?a.trackIds[n.prototype.id]++:"")}))}))).append("<span>".concat(n.prototype.name,"</span>")).appendTo(s).data("track",n.prototype)}))}))}s.css({left:"50%",marginLeft:s.width()/-2}),e(this).data("menu",s)}e(this).addClass("gv-active")}}));this.labelContainer.prepend(e('<li class="gv-unsortable">').append(e('<div class="gv-button-set" title="Tracks menu">').append(n)))},afterAddDomElements:function(){this.wrapper.after('<div class="gv-powered-by">Powered by <a target="_blank" href="https://wtsi-decipher-grp.github.io/Genoverse/">Genoverse</a></div>'),this.superContainer.find(".gv-panel-left").append(this.labelContainer)},"afterAddTracks afterRemoveTracks":function(){var t=this.superContainer.find(".gv-tracks-menu .gv-current-tracks");t.length&&t.data("reload").call(t)}}),this.on({afterSetName:function(t){var a=this.track;if(null!=a&&a.browser){var n=a.browser.superContainer.find(".gv-tracks-library-button").data("menu");n&&n.find(".gv-tracks-menu-track").filter((function(){return e(this).data("track")===a})).children(".gv-tracks-menu-track-name").attr("title",t).each((function(){t===a.defaultName?e(this).tipsy("hide").tipsy("disable"):e(this).tipsy("enable")}))}}},"tracks")},requires:n.default}},4394:function(t,e,a){a.r(e);var n=a(5337);e.default={karyotype:function(t){var e=this.jQuery;function a(){var a=e('<div class="gv-chromosome">'),i=e('<div class="gv-karyotype-container">').html(a).insertBefore(this.wrapper),s=this.assembly||this.genomeName,o="".concat(t.showAssembly&&s?"".concat(s,": "):"","Chr ").concat(this.chr);t.showAssembly&&s&&i.addClass("gv-show-assembly");var r=e('<div class="gv-chromosome"><ul class="gv-label-container"><li><span class="gv-name">'.concat(o,"</span></li></ul></div>")).appendTo(i),c=!1===t.karyotypeLabel?0:r.find(".gv-name").outerWidth(!0)+10;r.remove(),this.karyotype=new Genoverse({parent:this,container:a,width:a.width(),genome:this.genome,chr:this.chr,start:1,end:this.chromosomeSize,isStatic:!0,tracks:[n.default.extend({name:o,height:20,featureHeight:20,border:!1,legend:!1,unsortable:!0,click:function(t){var a=this.container.parent().offset().left,n=t.pageX-a,i=this.featurePositions.search({x:n,y:1,w:1,h:1})[0];if(i)if("mouseup"===t.type)this.browser.parent.isStatic||this.browser.parent.moveTo(i.chr,i.start,i.end,!0);else if(this.hoverFeature!==i&&!this.browser.hideTooltip){if(this.container.tipsy("hide"),i.label){var s=a+i.position[this.scale].start+i.position[this.scale].width/2;this.container.attr("title",i.label[0]).tipsy({trigger:"manual",container:"body"}).tipsy("show").data("tipsy").$tip.css("left",(function(){return s-e(this).width()/2}))}this.hoverFeature=i}},addUserEventHandlers:function(){var t=this;this.base(),this.container.on({mousemove:function(e){t.click(e)},mouseout:function(e){if(t.browser.viewPoint.is(e.relatedTarget)||t.browser.viewPoint.find(e.relatedTarget).length)return!0;t.container.tipsy("hide"),t.hoverFeature=!1}},".gv-image-container"),this.container.on("mousewheel",".gv-image-container, .gv-selector",(function(t){t.stopPropagation()}))},afterSetName:function(){this.label.css("lineHeight","".concat(this.label.height(),"px"))}})],addUserEventHandlers:function(){},afterInit:function(){this.updatePosition(),this.viewPoint.fadeIn()},afterAddTracks:function(){this.track=this.tracks[0]},afterAddDomElements:function(){var a=this,n=this.parent;function s(){a.hideTooltip=!0,a.track.prop("container").tipsy("hide")}function o(t,i){a.hideTooltip=!1;var s=a.chromosomeSize/a.width,o="resizestop"===t.type?e(this).data("ui-resizable").axis:void 0,r="e"===o?n.start:Math.max(Math.floor(i.position.left*s),1),c="w"===o?n.end:"dragstop"===t.type?r+n.length-1:Math.floor(i.helper.outerWidth(!0)*s)+r;r===n.start&&c===n.end||n.moveTo(a.chr,r,c,!0,"dragstop"===t.type)}!1===t.karyotypeLabel?(this.labelContainer.remove(),this.labelContainer=e(),i.addClass("gv-no-label")):this.labelContainer.width(c),this.viewPoint=e('<div class="gv-karyotype-viewpoint-wrapper"><div class="gv-karyotype-viewpoint"></div></div>').appendTo(i).css({left:c,width:this.width-c}).children().on({mousemove:function(t){a.track.controller.click(t)},mouseout:function(t){var n=e(t.relatedTarget);if(a.viewPoint.is(n)||a.viewPoint.find(n).length||"IMG"===n.prop("nodeName")&&n.parent().is(a.track.prop("imgContainers")[0]))return!0;a.track.prop("container").tipsy("hide"),a.track.prop("hoverFeature",!1)}}),n.isStatic||this.viewPoint.draggable({axis:"x",containment:this.wrapper,start:s,stop:o}).resizable({handles:"e, w",containment:"parent",start:s,stop:o,resize:function(t,e){e.element.css("left",Math.max(0,e.position.left)),e.position.left>0?e.element.width(Math.min(e.size.width,e.element.parent().width()-e.position.left)):e.element.width(e.size.width+e.position.left)}})},updatePosition:function(){var t=this.parent.start*this.scale,e=this.parent.end*this.scale-t;this.viewPoint.css({left:t,width:e})}}),!0!==this.loadedPlugins.controlPanel&&e('<li class="gv-unsortable">').height((function(t,e){return e+i.height()})).prependTo(this.labelContainer)}function i(){var t=this.karyotype.container.parent();this.karyotype.destroy(),t.remove(),a.call(this)}this.on({afterInit:a,afterSetRange:function(){this.karyotype&&this.karyotype.updatePosition()},afterSetWidth:i,afterMoveTo:function(t){this.karyotype&&this.karyotype.chr!==t&&i.call(this)}})}}}}]);
1
+ "use strict";(self.webpackChunkgenoverse=self.webpackChunkgenoverse||[]).push([[804],{1804:function(t,e,a){a.r(e);var n=a(4394);e.default={controlPanel:function(t){var e=this.jQuery;this.controls=[{name:"Scroll left and right by pressing and holding these buttons",buttons:[{name:"Scroll left",icon:'<i class="fas fa-chevron-left"></i>',class:"gv-scroll-left"},{name:"Scroll right",icon:'<i class="fas fa-chevron-right"></i>',class:"gv-scroll-right"}],init:function(t){var a=e(this);a.find(".gv-scroll-left, .gv-scroll-right").on({mousedown:function(){t.startDragScroll()},mouseup:function(){t.stopDragScroll()}}),a.find(".gv-scroll-left").mousehold(50,(function(){t.move(t.scrollDelta)})),a.find(".gv-scroll-right").mousehold(50,(function(){t.move(-t.scrollDelta)}))}},{name:"Zoom-in and zoom-out",buttons:[{name:"Zoom in",icon:'<i class="fas fa-search-plus"></i>',class:"gv-zoom-in",action:function(t){t.zoomIn()}},{name:"Zoom out",icon:'<i class="fas fa-search-minus"></i>',class:"gv-zoom-out",action:function(t){t.zoomOut()}}]},{name:"Toggle your mouse drag action between scroll left/right and select region",buttons:[{name:"Mouse drag action to scroll the browser left or right",icon:'<i class="fas fa-arrows-alt-h"></i>',class:"gv-drag-scroll",action:function(t){t.setDragAction("scroll"),e(this).addClass("gv-active").siblings().removeClass("gv-active")}},{name:"Mouse drag action to select a region",icon:"<i></i>",class:"gv-drag-select",action:function(t){t.setDragAction("select"),e(this).addClass("gv-active").siblings().removeClass("gv-active")}}],init:function(t){e(this).find(".gv-drag-".concat(t.dragAction)).addClass("gv-active").siblings().removeClass("gv-active")}},{name:"Toggle your mouse wheel action between zoom in/out and default page scroll",buttons:[{name:"Mouse wheel action to scroll the page up and down",icon:'<i class="fas fa-arrows-alt-v"></i>',class:"gv-wheel-off",action:function(t){t.setWheelAction("off"),e(this).addClass("gv-active").siblings().removeClass("gv-active")}},{name:"Mouse wheel to zoom in and out",icon:"&#177;",class:"gv-wheel-zoom",action:function(t){t.setWheelAction("zoom"),e(this).addClass("gv-active").siblings().removeClass("gv-active")}}],init:function(t){e(this).find(".gv-wheel-".concat(t.wheelAction)).addClass("gv-active").siblings().removeClass("gv-active")}}],this.saveable&&this.controls.push({icon:'<i class="fas fa-undo"></i>',name:"Reset tracks and configuration",action:function(t){t.resetConfig()}}),this.on({beforeInit:function(){var t=this,a=this;this.tracksLibrary=(this.tracksLibrary||this.tracks).map((function(e){return t.normaliseTrackDefinition(e)})).filter((function(t){return t.prototype.name}));var n=e('\n <table cellspacing=0 cellpadding=0 class="gv">\n <tr>\n <td class="gv-panel gv-panel-left"></td>\n <td class="gv-canvas-container"></td>\n <td class="gv-panel gv-panel-right"></td>\n </tr>\n </table>\n ').appendTo(this.container).find(".gv-panel-right");this.controlPanel=n,this.superContainer=this.container,this.container=e(".gv-canvas-container",this.container),a.controls.forEach((function(t){var n=e('<div class="gv-button-set">').attr("title",t.name).appendTo(a.superContainer.find(".gv-panel-right"));(t.buttons||[t]).forEach((function(i){var s=e("<button>".concat(i.icon,"</button>")).addClass(i.class).attr("title",i.name).appendTo(n);i.action&&s.on("click",(function(){i.action.call(s[0],a)})),i.init&&i!==t&&i.init.call(s[0],a)})),t.init&&t.init.call(n,a)})),this.superContainer.width(this.width),e(document).on("keydown",(function(t){27===t.keyCode&&(n.find("button.gv-drag-select").hasClass("gv-active")&&n.find("button.gv-drag-scroll").trigger("click"),e(".gv-menu .gv-close").trigger("click"))}))},afterInit:function(){var a=this,n=e('<button class="gv-tracks-library-button" title="Tracks menu"><i class="fas fa-bars"></i> Tracks</button>').on("click",(function(){var n=this,i=function t(e,a){var n,i;return null!==(n=e.constructor)&&void 0!==n&&null!==(i=n.ancestor)&&void 0!==i&&i.prototype?t(e.constructor.ancestor.prototype,a.concat(e.constructor.ancestor.prototype.tags||[])):a};if(e(this).hasClass("gv-active"))e(".gv-menu.gv-tracks-menu .gv-close").trigger("click"),e(this).removeClass("gv-active");else{var s=e(this).data("menu");if(s)s.show();else{var o;s=a.makeMenu({"Currently enabled tracks:":"Available tracks:",'<div class="gv-current-tracks"></div>':'<input placeholder="Search"><div class="gv-available-tracks"></div>'}).addClass("gv-tracks-menu"),e("input[placeholder=Search]",s).on("keyup",(function(){var t=this.value.toLowerCase();e(".gv-tracks-library-item",s).each((function(){var a=e(this).data("track"),n=!1;a.name&&a.name.toLowerCase().indexOf(t)>=0?n=!0:i(a,[]).concat(a.tags||[]).some((function(e){return e.toLowerCase().indexOf(t)>=0}))&&(n=!0);e(this)[n?"removeClass":"addClass"]("gv-hide")})),e(".gv-tracks-library-category",s).each((function(){var t=e(this).children(".gv-tracks-library-item:not(.gv-hide)");e(this)[t.length?"removeClass":"addClass"]("gv-hide")}))})),e(".gv-close",s).on("click",(function(){e(n).removeClass("gv-active")}));var r=e(".gv-available-tracks",s),c=e(".gv-current-tracks",s).before('<div class="gv-current-tracks-instructions">Drag and drop to reorder</div>').data({reload:function(){e(this).empty().data("listTracks")()},listTracks:function(){a.tracks.filter((function(t){return t.name&&!(!1===t.removable&&t.unsortable)&&!t.parentTrack&&!t.lockToTrack})).forEach((function(t){var a=e('<div class="gv-tracks-menu-track">').append('<span class="gv-tracks-menu-track-name" title="'.concat(t.name,'">').concat(t.defaultName,"</span>")).appendTo(c).data("track",t).addClass(t.unsortable?"gv-unsortable":"");!1===t.removable?a.prepend('<i class="gv-remove-track gv-menu-button fas fa-circle">'):a.prepend(e('<i class="gv-remove-track gv-menu-button fas fa-times-circle">').on("click",(function(){t.remove()})));var n=a.find(".gv-tracks-menu-track-name").tipsy({gravity:"w",trigger:"manual"}).on("mouseenter",(function(){var t=e(this).tipsy("show").data("tipsy").$tip;t&&t.css("zIndex",1002)})).on("mouseleave",(function(){e(this).tipsy("hide")}));t.name===t.defaultName&&n.tipsy("disable")}))}}).sortable({items:"div:not(.gv-unsortable)",cursor:"move",axis:"y",handle:"span",update:a.updateTrackOrder.bind(a),start:function(){c.find(".gv-tracks-menu-track-name").each((function(){e(this).tipsy("hide").tipsy("disable")}))},stop:function(){c.find(".gv-tracks-menu-track-name").each((function(){e(this).tipsy("enable")}))}});if(c.data("listTracks")(),a.saveable&&e('<div class="gv-tracks-menu-reset gv-menu-button"><i class="fas fa-undo"></i> Reset tracks and configuration</div>').insertAfter(c).on("click",(function(t){t.preventDefault(),a.resetConfig()})),null!==(o=a.tracksLibrary)&&void 0!==o&&o.length){var l=a.tracksLibrary.filter((function(t){return t.prototype.name&&!1!==t.prototype.removable})).reduce((function(t,e){var a=e.prototype.category||"";return t[a]=t[a]||[],t[a].push([e.prototype.name.toLowerCase(),e]),t}),{}),d=((null==t?void 0:t.tracksLibraryCategoryOrder)||[]).reduce((function(t,e,a){return Object.assign(t,(s=a+1,(i=e)in(n={})?Object.defineProperty(n,i,{value:s,enumerable:!0,configurable:!0,writable:!0}):n[i]=s,n));var n,i,s}),{});Object.keys(l).sort((function(t,e){return Boolean(e)-Boolean(t)||d[t]-d[e]||t.localeCompare(e)})).forEach((function(t,n,i){var s=i.length>1?e('<div class="gv-tracks-library-category">').append(e('<div class="gv-tracks-library-category-header">').html(t||"Other")).appendTo(r):r;l[t].sort((function(t,e){return t[0].localeCompare(e[0])})).forEach((function(t){var n=t[1];e('<div class="gv-tracks-library-item">').append(e('<i class="gv-add-track gv-menu-button fas fa-plus-circle">').on("click",(function(){a.trackIds=a.trackIds||{},a.trackIds[n.prototype.id]=a.trackIds[n.prototype.id]||1,a.addTrack(n.extend({id:"".concat(n.prototype.id).concat(a.tracksById[n.prototype.id]?a.trackIds[n.prototype.id]++:"")}))}))).append("<span>".concat(n.prototype.name,"</span>")).appendTo(s).data("track",n.prototype)}))}))}s.css({left:"50%",marginLeft:s.width()/-2}),e(this).data("menu",s)}e(this).addClass("gv-active")}}));this.labelContainer.prepend(e('<li class="gv-unsortable">').append(e('<div class="gv-button-set" title="Tracks menu">').append(n)))},afterAddDomElements:function(){this.wrapper.after('<div class="gv-powered-by">Powered by <a target="_blank" href="https://github.com/DECIPHER-genomics/Genoverse">Genoverse</a></div>'),this.superContainer.find(".gv-panel-left").append(this.labelContainer)},"afterAddTracks afterRemoveTracks":function(){var t=this.superContainer.find(".gv-tracks-menu .gv-current-tracks");t.length&&t.data("reload").call(t)}}),this.on({afterSetName:function(t){var a=this.track;if(null!=a&&a.browser){var n=a.browser.superContainer.find(".gv-tracks-library-button").data("menu");n&&n.find(".gv-tracks-menu-track").filter((function(){return e(this).data("track")===a})).children(".gv-tracks-menu-track-name").attr("title",t).each((function(){t===a.defaultName?e(this).tipsy("hide").tipsy("disable"):e(this).tipsy("enable")}))}}},"tracks")},requires:n.default}},4394:function(t,e,a){a.r(e);var n=a(5337);e.default={karyotype:function(t){var e=this.jQuery;function a(){var a=e('<div class="gv-chromosome">'),i=e('<div class="gv-karyotype-container">').html(a).insertBefore(this.wrapper),s=this.assembly||this.genomeName,o="".concat(t.showAssembly&&s?"".concat(s,": "):"","Chr ").concat(this.chr);t.showAssembly&&s&&i.addClass("gv-show-assembly");var r=e('<div class="gv-chromosome"><ul class="gv-label-container"><li><span class="gv-name">'.concat(o,"</span></li></ul></div>")).appendTo(i),c=!1===t.karyotypeLabel?0:r.find(".gv-name").outerWidth(!0)+10;r.remove(),this.karyotype=new Genoverse({parent:this,container:a,width:a.width(),genome:this.genome,chr:this.chr,start:1,end:this.chromosomeSize,isStatic:!0,tracks:[n.default.extend({name:o,height:20,featureHeight:20,border:!1,legend:!1,unsortable:!0,click:function(t){var a=this.container.parent().offset().left,n=t.pageX-a,i=this.featurePositions.search({x:n,y:1,w:1,h:1})[0];if(i)if("mouseup"===t.type)this.browser.parent.isStatic||this.browser.parent.moveTo(i.chr,i.start,i.end,!0);else if(this.hoverFeature!==i&&!this.browser.hideTooltip){if(this.container.tipsy("hide"),i.label){var s=a+i.position[this.scale].start+i.position[this.scale].width/2;this.container.attr("title",i.label[0]).tipsy({trigger:"manual",container:"body"}).tipsy("show").data("tipsy").$tip.css("left",(function(){return s-e(this).width()/2}))}this.hoverFeature=i}},addUserEventHandlers:function(){var t=this;this.base(),this.container.on({mousemove:function(e){t.click(e)},mouseout:function(e){if(t.browser.viewPoint.is(e.relatedTarget)||t.browser.viewPoint.find(e.relatedTarget).length)return!0;t.container.tipsy("hide"),t.hoverFeature=!1}},".gv-image-container"),this.container.on("mousewheel",".gv-image-container, .gv-selector",(function(t){t.stopPropagation()}))},afterSetName:function(){this.label.css("lineHeight","".concat(this.label.height(),"px"))}})],addUserEventHandlers:function(){},afterInit:function(){this.updatePosition(),this.viewPoint.fadeIn()},afterAddTracks:function(){this.track=this.tracks[0]},afterAddDomElements:function(){var a=this,n=this.parent;function s(){a.hideTooltip=!0,a.track.prop("container").tipsy("hide")}function o(t,i){a.hideTooltip=!1;var s=a.chromosomeSize/a.width,o="resizestop"===t.type?e(this).data("ui-resizable").axis:void 0,r="e"===o?n.start:Math.max(Math.floor(i.position.left*s),1),c="w"===o?n.end:"dragstop"===t.type?r+n.length-1:Math.floor(i.helper.outerWidth(!0)*s)+r;r===n.start&&c===n.end||n.moveTo(a.chr,r,c,!0,"dragstop"===t.type)}!1===t.karyotypeLabel?(this.labelContainer.remove(),this.labelContainer=e(),i.addClass("gv-no-label")):this.labelContainer.width(c),this.viewPoint=e('<div class="gv-karyotype-viewpoint-wrapper"><div class="gv-karyotype-viewpoint"></div></div>').appendTo(i).css({left:c,width:this.width-c}).children().on({mousemove:function(t){a.track.controller.click(t)},mouseout:function(t){var n=e(t.relatedTarget);if(a.viewPoint.is(n)||a.viewPoint.find(n).length||"IMG"===n.prop("nodeName")&&n.parent().is(a.track.prop("imgContainers")[0]))return!0;a.track.prop("container").tipsy("hide"),a.track.prop("hoverFeature",!1)}}),n.isStatic||this.viewPoint.draggable({axis:"x",containment:this.wrapper,start:s,stop:o}).resizable({handles:"e, w",containment:"parent",start:s,stop:o,resize:function(t,e){e.element.css("left",Math.max(0,e.position.left)),e.position.left>0?e.element.width(Math.min(e.size.width,e.element.parent().width()-e.position.left)):e.element.width(e.size.width+e.position.left)}})},updatePosition:function(){var t=this.parent.start*this.scale,e=this.parent.end*this.scale-t;this.viewPoint.css({left:t,width:e})}}),!0!==this.loadedPlugins.controlPanel&&e('<li class="gv-unsortable">').height((function(t,e){return e+i.height()})).prependTo(this.labelContainer)}function i(){var t=this.karyotype.container.parent();this.karyotype.destroy(),t.remove(),a.call(this)}this.on({afterInit:a,afterSetRange:function(){this.karyotype&&this.karyotype.updatePosition()},afterSetWidth:i,afterMoveTo:function(t){this.karyotype&&this.karyotype.chr!==t&&i.call(this)}})}}}}]);
2
2
  //# sourceMappingURL=804.genoverse.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"804.genoverse.js","mappings":"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","sources":["webpack://genoverse/./src/js/plugins/controlPanel.js","webpack://genoverse/./src/js/plugins/karyotype.js"],"sourcesContent":["import '../../css/controlPanel.css';\nimport karyotype from './karyotype';\n\nconst plugin = function (pluginConf) {\n const jQuery = this.jQuery;\n\n this.controls = [\n // Scroll left/right\n {\n name : 'Scroll left and right by pressing and holding these buttons',\n buttons : [{\n name : 'Scroll left',\n icon : '<i class=\"fas fa-chevron-left\"></i>',\n class : 'gv-scroll-left',\n }, {\n name : 'Scroll right',\n icon : '<i class=\"fas fa-chevron-right\"></i>',\n class : 'gv-scroll-right',\n }],\n init: function (browser) {\n const el = jQuery(this);\n\n el.find('.gv-scroll-left, .gv-scroll-right').on({\n mousedown : () => { browser.startDragScroll(); },\n mouseup : () => { browser.stopDragScroll(); },\n });\n\n el.find('.gv-scroll-left').mousehold(50, () => { browser.move(browser.scrollDelta); });\n el.find('.gv-scroll-right').mousehold(50, () => { browser.move(-browser.scrollDelta); });\n },\n },\n\n // Zoom in/out\n {\n name : 'Zoom-in and zoom-out',\n buttons : [{\n name : 'Zoom in',\n icon : '<i class=\"fas fa-search-plus\"></i>',\n class : 'gv-zoom-in',\n action : (browser) => { browser.zoomIn(); },\n }, {\n name : 'Zoom out',\n icon : '<i class=\"fas fa-search-minus\"></i>',\n class : 'gv-zoom-out',\n action : (browser) => { browser.zoomOut(); },\n }],\n },\n\n // Toogle drag action\n {\n name : 'Toggle your mouse drag action between scroll left/right and select region',\n buttons : [{\n name : 'Mouse drag action to scroll the browser left or right',\n icon : '<i class=\"fas fa-arrows-alt-h\"></i>',\n class : 'gv-drag-scroll',\n action : function (browser) {\n browser.setDragAction('scroll');\n jQuery(this).addClass('gv-active').siblings().removeClass('gv-active');\n },\n }, {\n name : 'Mouse drag action to select a region',\n icon : '<i></i>',\n class : 'gv-drag-select',\n action : function (browser) {\n browser.setDragAction('select');\n jQuery(this).addClass('gv-active').siblings().removeClass('gv-active');\n },\n }],\n init: function (browser) {\n jQuery(this).find(`.gv-drag-${browser.dragAction}`).addClass('gv-active').siblings().removeClass('gv-active');\n },\n },\n\n // Toogle wheel action\n {\n name : 'Toggle your mouse wheel action between zoom in/out and default page scroll',\n buttons : [{\n name : 'Mouse wheel action to scroll the page up and down',\n icon : '<i class=\"fas fa-arrows-alt-v\"></i>',\n class : 'gv-wheel-off',\n action : function (browser) {\n browser.setWheelAction('off');\n jQuery(this).addClass('gv-active').siblings().removeClass('gv-active');\n },\n }, {\n name : 'Mouse wheel to zoom in and out',\n icon : '&#177;',\n class : 'gv-wheel-zoom',\n action : function (browser) {\n browser.setWheelAction('zoom');\n jQuery(this).addClass('gv-active').siblings().removeClass('gv-active');\n },\n }],\n init: function (browser) {\n jQuery(this).find(`.gv-wheel-${browser.wheelAction}`).addClass('gv-active').siblings().removeClass('gv-active');\n },\n },\n ];\n\n if (this.saveable) {\n this.controls.push({\n icon : '<i class=\"fas fa-undo\"></i>',\n name : 'Reset tracks and configuration',\n action : (browser) => { browser.resetConfig(); },\n });\n }\n\n this.on({\n beforeInit: function () {\n const browser = this;\n\n this.tracksLibrary = (this.tracksLibrary || this.tracks).map(\n track => this.normaliseTrackDefinition(track)\n ).filter(\n track => track.prototype.name\n );\n\n const panel = jQuery(`\n <table cellspacing=0 cellpadding=0 class=\"gv\">\n <tr>\n <td class=\"gv-panel gv-panel-left\"></td>\n <td class=\"gv-canvas-container\"></td>\n <td class=\"gv-panel gv-panel-right\"></td>\n </tr>\n </table>\n `).appendTo(this.container).find('.gv-panel-right');\n\n this.controlPanel = panel;\n this.superContainer = this.container;\n this.container = jQuery('.gv-canvas-container', this.container);\n\n browser.controls.forEach(\n (control) => {\n const buttonSet = jQuery('<div class=\"gv-button-set\">').attr('title', control.name).appendTo(browser.superContainer.find('.gv-panel-right'));\n const buttons = control.buttons || [ control ];\n\n buttons.forEach(\n (button) => {\n const el = jQuery(`<button>${button.icon}</button>`).addClass(button.class).attr('title', button.name).appendTo(buttonSet);\n\n if (button.action) {\n el.on('click', () => {\n button.action.call(el[0], browser);\n });\n }\n\n if (button.init && button !== control) {\n button.init.call(el[0], browser);\n }\n }\n );\n\n if (control.init) {\n control.init.call(buttonSet, browser);\n }\n }\n );\n\n this.superContainer.width(this.width);\n\n // ESC key to toggle crosshair select to drag mode and close menus\n jQuery(document).on('keydown', (e) => {\n if (e.keyCode === 27) {\n if (panel.find('button.gv-drag-select').hasClass('gv-active')) {\n panel.find('button.gv-drag-scroll').trigger('click');\n }\n\n jQuery('.gv-menu .gv-close').trigger('click');\n }\n });\n },\n\n afterInit: function () {\n const browser = this;\n const tracksButton = jQuery('<button class=\"gv-tracks-library-button\" title=\"Tracks menu\"><i class=\"fas fa-bars\"></i> Tracks</button>').on('click', function () {\n const button = this;\n\n const getTrackTags = (track, tags) => (\n track.constructor?.ancestor?.prototype\n ? getTrackTags(track.constructor.ancestor.prototype, tags.concat(track.constructor.ancestor.prototype.tags || []))\n : tags\n );\n\n if (jQuery(this).hasClass('gv-active')) {\n jQuery('.gv-menu.gv-tracks-menu .gv-close').trigger('click');\n jQuery(this).removeClass('gv-active');\n } else {\n let menu = jQuery(this).data('menu');\n\n if (menu) {\n menu.show();\n } else {\n menu = browser.makeMenu({\n 'Currently enabled tracks:' : 'Available tracks:',\n '<div class=\"gv-current-tracks\"></div>' : '<input placeholder=\"Search\"><div class=\"gv-available-tracks\"></div>',\n }).addClass('gv-tracks-menu');\n\n jQuery('input[placeholder=Search]', menu).on('keyup', function () {\n const str = this.value.toLowerCase();\n\n jQuery('.gv-tracks-library-item', menu).each(function () {\n const track = jQuery(this).data('track');\n\n let match = false;\n\n if (track.name && track.name.toLowerCase().indexOf(str) >= 0) {\n match = true;\n } else {\n const tags = getTrackTags(track, []).concat(track.tags || []);\n\n if (tags.some(tag => tag.toLowerCase().indexOf(str) >= 0)) {\n match = true;\n }\n }\n\n jQuery(this)[match ? 'removeClass' : 'addClass']('gv-hide');\n });\n\n jQuery('.gv-tracks-library-category', menu).each(function () {\n const visibleTracks = jQuery(this).children('.gv-tracks-library-item:not(.gv-hide)');\n\n jQuery(this)[visibleTracks.length ? 'removeClass' : 'addClass']('gv-hide');\n });\n });\n\n jQuery('.gv-close', menu).on('click', () => {\n jQuery(button).removeClass('gv-active');\n });\n\n const availableTracks = jQuery('.gv-available-tracks', menu);\n const currentTracks = jQuery('.gv-current-tracks', menu).before('<div class=\"gv-current-tracks-instructions\">Drag and drop to reorder</div>').data({\n reload : function () { jQuery(this).empty().data('listTracks')(); },\n listTracks : function () {\n browser.tracks.filter(\n track => track.name && !(track.removable === false && track.unsortable) && !track.parentTrack && !track.lockToTrack\n ).forEach(\n (track) => {\n const el = jQuery('<div class=\"gv-tracks-menu-track\">')\n .append(`<span class=\"gv-tracks-menu-track-name\" title=\"${track.name}\">${track.defaultName}</span>`)\n .appendTo(currentTracks)\n .data('track', track)\n .addClass(track.unsortable ? 'gv-unsortable' : '');\n\n if (track.removable === false) {\n el.prepend('<i class=\"gv-remove-track gv-menu-button fas fa-circle\">');\n } else {\n el.prepend(jQuery('<i class=\"gv-remove-track gv-menu-button fas fa-times-circle\">').on('click', () => { track.remove(); }));\n }\n\n const trackNameEl = el.find('.gv-tracks-menu-track-name').tipsy({ gravity: 'w', trigger: 'manual' }).on('mouseenter', function () {\n const tip = jQuery(this).tipsy('show').data('tipsy').$tip;\n\n if (tip) {\n tip.css('zIndex', 1002);\n }\n }).on('mouseleave', function () {\n jQuery(this).tipsy('hide');\n });\n\n if (track.name === track.defaultName) {\n trackNameEl.tipsy('disable');\n }\n }\n );\n },\n }).sortable({\n items : 'div:not(.gv-unsortable)',\n cursor : 'move',\n axis : 'y',\n handle : 'span',\n update : browser.updateTrackOrder.bind(browser),\n start : function () {\n currentTracks.find('.gv-tracks-menu-track-name').each(function () { jQuery(this).tipsy('hide').tipsy('disable'); });\n },\n stop: function () {\n currentTracks.find('.gv-tracks-menu-track-name').each(function () { jQuery(this).tipsy('enable'); });\n },\n });\n\n currentTracks.data('listTracks')();\n\n if (browser.saveable) {\n jQuery('<div class=\"gv-tracks-menu-reset gv-menu-button\"><i class=\"fas fa-undo\"></i> Reset tracks and configuration</div>').insertAfter(currentTracks).on('click', (e) => {\n e.preventDefault();\n browser.resetConfig();\n });\n }\n\n if (browser.tracksLibrary?.length) {\n const tracksLibraryCategories = browser.tracksLibrary.filter(track => track.prototype.name && track.prototype.removable !== false).reduce(\n (acc, track) => {\n const categoryName = track.prototype.category || '';\n\n acc[categoryName] = acc[categoryName] || [];\n acc[categoryName].push([ track.prototype.name.toLowerCase(), track ]);\n\n return acc;\n },\n {}\n );\n\n const tracksLibraryCategoryOrder = (pluginConf?.tracksLibraryCategoryOrder || []).reduce(\n (acc, categoryName, i) => Object.assign(acc, { [categoryName]: i + 1 }),\n {}\n );\n\n Object.keys(tracksLibraryCategories).sort((a, b) => (Boolean(b) - Boolean(a)) || (tracksLibraryCategoryOrder[a] - tracksLibraryCategoryOrder[b]) || a.localeCompare(b)).forEach(\n (categoryName, i, allCategoryNames) => {\n const parentEl = (\n allCategoryNames.length > 1\n ? jQuery('<div class=\"gv-tracks-library-category\">').append(\n jQuery('<div class=\"gv-tracks-library-category-header\">').html(categoryName || 'Other')\n ).appendTo(availableTracks)\n : availableTracks\n );\n\n tracksLibraryCategories[categoryName].sort((a, b) => a[0].localeCompare(b[0])).forEach(\n (row) => {\n const track = row[1];\n\n jQuery('<div class=\"gv-tracks-library-item\">').append(\n jQuery('<i class=\"gv-add-track gv-menu-button fas fa-plus-circle\">').on('click', () => {\n browser.trackIds = browser.trackIds || {};\n browser.trackIds[track.prototype.id] = browser.trackIds[track.prototype.id] || 1;\n\n browser.addTrack(track.extend({ id: `${track.prototype.id}${browser.tracksById[track.prototype.id] ? browser.trackIds[track.prototype.id]++ : ''}` }));\n })\n ).append(`<span>${track.prototype.name}</span>`).appendTo(parentEl).data('track', track.prototype);\n }\n );\n }\n );\n }\n\n menu.css({ left: '50%', marginLeft: menu.width() / -2 });\n\n jQuery(this).data('menu', menu);\n }\n\n jQuery(this).addClass('gv-active');\n }\n });\n\n this.labelContainer.prepend(\n jQuery('<li class=\"gv-unsortable\">').append(\n jQuery('<div class=\"gv-button-set\" title=\"Tracks menu\">').append(tracksButton)\n )\n );\n },\n\n afterAddDomElements: function () {\n this.wrapper.after('<div class=\"gv-powered-by\">Powered by <a target=\"_blank\" href=\"https://wtsi-decipher-grp.github.io/Genoverse/\">Genoverse</a></div>');\n this.superContainer.find('.gv-panel-left').append(this.labelContainer);\n },\n\n 'afterAddTracks afterRemoveTracks': function () {\n const currentTracks = this.superContainer.find('.gv-tracks-menu .gv-current-tracks');\n\n if (currentTracks.length) {\n currentTracks.data('reload').call(currentTracks);\n }\n },\n });\n\n this.on({\n afterSetName: function (name) {\n const track = this.track;\n\n if (track?.browser) {\n const menu = track.browser.superContainer.find('.gv-tracks-library-button').data('menu');\n\n if (menu) {\n menu.find('.gv-tracks-menu-track').filter(function () {\n return jQuery(this).data('track') === track;\n }).children('.gv-tracks-menu-track-name').attr('title', name).each(function () {\n if (name === track.defaultName) {\n jQuery(this).tipsy('hide').tipsy('disable');\n } else {\n jQuery(this).tipsy('enable');\n }\n });\n }\n }\n },\n }, 'tracks');\n};\n\nexport default { controlPanel: plugin, requires: karyotype };\n","import '../../css/karyotype.css';\nimport Chromosome from '../Track/library/Chromosome';\n\nconst plugin = function (pluginConf) {\n const jQuery = this.jQuery;\n\n function createKaryotype() {\n const chromosome = jQuery('<div class=\"gv-chromosome\">');\n const container = jQuery('<div class=\"gv-karyotype-container\">').html(chromosome).insertBefore(this.wrapper);\n const assemblyName = this.assembly || this.genomeName;\n const name = `${pluginConf.showAssembly && assemblyName ? `${assemblyName}: ` : ''}Chr ${this.chr}`;\n\n if (pluginConf.showAssembly && assemblyName) {\n container.addClass('gv-show-assembly');\n }\n\n const measureWidth = jQuery(`<div class=\"gv-chromosome\"><ul class=\"gv-label-container\"><li><span class=\"gv-name\">${name}</span></li></ul></div>`).appendTo(container);\n const labelWidth = pluginConf.karyotypeLabel === false ? 0 : measureWidth.find('.gv-name').outerWidth(true) + 10;\n\n measureWidth.remove();\n\n this.karyotype = new Genoverse({\n parent : this,\n container : chromosome,\n width : chromosome.width(),\n genome : this.genome,\n chr : this.chr,\n start : 1,\n end : this.chromosomeSize,\n isStatic : true,\n tracks : [\n Chromosome.extend({\n name : name,\n height : 20,\n featureHeight : 20,\n border : false,\n legend : false,\n unsortable : true,\n\n click: function (e) {\n const offset = this.container.parent().offset().left;\n const x = e.pageX - offset;\n const f = this.featurePositions.search({ x: x, y: 1, w: 1, h: 1 })[0];\n\n if (f) {\n if (e.type === 'mouseup') {\n if (!this.browser.parent.isStatic) {\n this.browser.parent.moveTo(f.chr, f.start, f.end, true);\n }\n } else if (this.hoverFeature !== f && !this.browser.hideTooltip) {\n this.container.tipsy('hide');\n\n if (f.label) {\n const left = offset + f.position[this.scale].start + f.position[this.scale].width / 2;\n\n this.container.attr('title', f.label[0]).tipsy({ trigger: 'manual', container: 'body' }).tipsy('show').data('tipsy').$tip.css('left', function () { return left - jQuery(this).width() / 2; });\n }\n\n this.hoverFeature = f;\n }\n }\n },\n\n addUserEventHandlers: function () {\n const track = this;\n\n this.base();\n\n this.container.on({\n mousemove : (e) => { track.click(e); },\n mouseout : (e) => {\n if (track.browser.viewPoint.is(e.relatedTarget) || track.browser.viewPoint.find(e.relatedTarget).length) {\n return true;\n }\n\n track.container.tipsy('hide');\n track.hoverFeature = false;\n },\n }, '.gv-image-container');\n\n // Don't allow zooming in and out on the karyotype image\n this.container.on('mousewheel', '.gv-image-container, .gv-selector', (e) => {\n e.stopPropagation();\n });\n },\n\n afterSetName: function () {\n this.label.css('lineHeight', `${this.label.height()}px`);\n },\n }),\n ],\n\n addUserEventHandlers: () => {},\n\n afterInit: function () {\n this.updatePosition();\n this.viewPoint.fadeIn();\n },\n\n afterAddTracks: function () {\n this.track = this.tracks[0];\n },\n\n afterAddDomElements: function () {\n const karyotype = this;\n const parent = this.parent;\n\n function hideTooltip() {\n karyotype.hideTooltip = true;\n karyotype.track.prop('container').tipsy('hide');\n }\n\n function updateLocation(e, ui) {\n karyotype.hideTooltip = false;\n\n const scale = karyotype.chromosomeSize / karyotype.width;\n const axis = e.type === 'resizestop' ? jQuery(this).data('ui-resizable').axis : undefined;\n const start = axis === 'e' ? parent.start : Math.max(Math.floor(ui.position.left * scale), 1);\n const end = axis === 'w' ? parent.end : e.type === 'dragstop' ? start + parent.length - 1 : Math.floor(ui.helper.outerWidth(true) * scale) + start;\n\n if (start !== parent.start || end !== parent.end) {\n parent.moveTo(karyotype.chr, start, end, true, e.type === 'dragstop');\n }\n }\n\n if (pluginConf.karyotypeLabel === false) {\n this.labelContainer.remove();\n this.labelContainer = jQuery();\n container.addClass('gv-no-label');\n } else {\n this.labelContainer.width(labelWidth);\n }\n\n this.viewPoint = jQuery('<div class=\"gv-karyotype-viewpoint-wrapper\"><div class=\"gv-karyotype-viewpoint\"></div></div>').appendTo(container).css({\n left : labelWidth,\n width : this.width - labelWidth,\n }).children().on({\n mousemove : (e) => { karyotype.track.controller.click(e); },\n mouseout : (e) => {\n const el = jQuery(e.relatedTarget);\n\n if (karyotype.viewPoint.is(el) || karyotype.viewPoint.find(el).length || (el.prop('nodeName') === 'IMG' && el.parent().is(karyotype.track.prop('imgContainers')[0]))) {\n return true;\n }\n\n karyotype.track.prop('container').tipsy('hide');\n karyotype.track.prop('hoverFeature', false);\n },\n });\n\n if (!parent.isStatic) {\n this.viewPoint.draggable({\n axis : 'x',\n containment : this.wrapper,\n start : hideTooltip,\n stop : updateLocation,\n }).resizable({\n handles : 'e, w',\n containment : 'parent',\n start : hideTooltip,\n stop : updateLocation,\n resize : function (e, ui) {\n ui.element.css('left', Math.max(0, ui.position.left));\n\n if (ui.position.left > 0) {\n ui.element.width(Math.min(ui.size.width, ui.element.parent().width() - ui.position.left));\n } else {\n ui.element.width(ui.size.width + ui.position.left);\n }\n },\n });\n }\n },\n\n updatePosition: function () {\n const left = this.parent.start * this.scale;\n const width = (this.parent.end * this.scale) - left;\n\n this.viewPoint.css({ left: left, width: width });\n },\n });\n\n if (this.loadedPlugins.controlPanel !== true) {\n jQuery('<li class=\"gv-unsortable\">').height((i, h) => h + container.height()).prependTo(this.labelContainer);\n }\n }\n\n function recreateKaryotype() {\n const container = this.karyotype.container.parent();\n\n this.karyotype.destroy();\n container.remove();\n\n createKaryotype.call(this);\n }\n\n this.on({\n afterInit: createKaryotype,\n\n afterSetRange: function () {\n if (this.karyotype) {\n this.karyotype.updatePosition();\n }\n },\n\n afterSetWidth: recreateKaryotype,\n\n afterMoveTo: function (chr) {\n if (this.karyotype && this.karyotype.chr !== chr) {\n recreateKaryotype.call(this);\n }\n },\n });\n};\n\nexport default { karyotype: plugin };\n"],"names":["controlPanel","pluginConf","jQuery","this","controls","name","buttons","icon","class","init","browser","el","find","on","mousedown","startDragScroll","mouseup","stopDragScroll","mousehold","move","scrollDelta","action","zoomIn","zoomOut","setDragAction","addClass","siblings","removeClass","dragAction","setWheelAction","wheelAction","saveable","push","resetConfig","beforeInit","tracksLibrary","tracks","map","track","normaliseTrackDefinition","filter","prototype","panel","appendTo","container","superContainer","forEach","control","buttonSet","attr","button","call","width","document","e","keyCode","hasClass","trigger","afterInit","tracksButton","getTrackTags","tags","constructor","ancestor","concat","menu","data","show","makeMenu","str","value","toLowerCase","each","match","indexOf","some","tag","visibleTracks","children","length","availableTracks","currentTracks","before","reload","empty","listTracks","removable","unsortable","parentTrack","lockToTrack","append","defaultName","prepend","remove","trackNameEl","tipsy","gravity","tip","$tip","css","sortable","items","cursor","axis","handle","update","updateTrackOrder","bind","start","stop","insertAfter","preventDefault","tracksLibraryCategories","reduce","acc","categoryName","category","tracksLibraryCategoryOrder","i","Object","assign","keys","sort","a","b","Boolean","localeCompare","allCategoryNames","parentEl","html","row","trackIds","id","addTrack","extend","tracksById","left","marginLeft","labelContainer","afterAddDomElements","wrapper","after","afterSetName","requires","karyotype","createKaryotype","chromosome","insertBefore","assemblyName","assembly","genomeName","showAssembly","chr","measureWidth","labelWidth","karyotypeLabel","outerWidth","Genoverse","parent","genome","end","chromosomeSize","isStatic","Chromosome","height","featureHeight","border","legend","click","offset","x","pageX","f","featurePositions","search","y","w","h","type","moveTo","hoverFeature","hideTooltip","label","position","scale","addUserEventHandlers","base","mousemove","mouseout","viewPoint","is","relatedTarget","stopPropagation","updatePosition","fadeIn","afterAddTracks","prop","updateLocation","ui","undefined","Math","max","floor","helper","controller","draggable","containment","resizable","handles","resize","element","min","size","loadedPlugins","prependTo","recreateKaryotype","destroy","afterSetRange","afterSetWidth","afterMoveTo"],"sourceRoot":""}
1
+ {"version":3,"file":"804.genoverse.js","mappings":"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","sources":["webpack://genoverse/./src/js/plugins/controlPanel.js","webpack://genoverse/./src/js/plugins/karyotype.js"],"sourcesContent":["import '../../css/controlPanel.css';\nimport karyotype from './karyotype';\n\nconst plugin = function (pluginConf) {\n const jQuery = this.jQuery;\n\n this.controls = [\n // Scroll left/right\n {\n name : 'Scroll left and right by pressing and holding these buttons',\n buttons : [{\n name : 'Scroll left',\n icon : '<i class=\"fas fa-chevron-left\"></i>',\n class : 'gv-scroll-left',\n }, {\n name : 'Scroll right',\n icon : '<i class=\"fas fa-chevron-right\"></i>',\n class : 'gv-scroll-right',\n }],\n init: function (browser) {\n const el = jQuery(this);\n\n el.find('.gv-scroll-left, .gv-scroll-right').on({\n mousedown : () => { browser.startDragScroll(); },\n mouseup : () => { browser.stopDragScroll(); },\n });\n\n el.find('.gv-scroll-left').mousehold(50, () => { browser.move(browser.scrollDelta); });\n el.find('.gv-scroll-right').mousehold(50, () => { browser.move(-browser.scrollDelta); });\n },\n },\n\n // Zoom in/out\n {\n name : 'Zoom-in and zoom-out',\n buttons : [{\n name : 'Zoom in',\n icon : '<i class=\"fas fa-search-plus\"></i>',\n class : 'gv-zoom-in',\n action : (browser) => { browser.zoomIn(); },\n }, {\n name : 'Zoom out',\n icon : '<i class=\"fas fa-search-minus\"></i>',\n class : 'gv-zoom-out',\n action : (browser) => { browser.zoomOut(); },\n }],\n },\n\n // Toogle drag action\n {\n name : 'Toggle your mouse drag action between scroll left/right and select region',\n buttons : [{\n name : 'Mouse drag action to scroll the browser left or right',\n icon : '<i class=\"fas fa-arrows-alt-h\"></i>',\n class : 'gv-drag-scroll',\n action : function (browser) {\n browser.setDragAction('scroll');\n jQuery(this).addClass('gv-active').siblings().removeClass('gv-active');\n },\n }, {\n name : 'Mouse drag action to select a region',\n icon : '<i></i>',\n class : 'gv-drag-select',\n action : function (browser) {\n browser.setDragAction('select');\n jQuery(this).addClass('gv-active').siblings().removeClass('gv-active');\n },\n }],\n init: function (browser) {\n jQuery(this).find(`.gv-drag-${browser.dragAction}`).addClass('gv-active').siblings().removeClass('gv-active');\n },\n },\n\n // Toogle wheel action\n {\n name : 'Toggle your mouse wheel action between zoom in/out and default page scroll',\n buttons : [{\n name : 'Mouse wheel action to scroll the page up and down',\n icon : '<i class=\"fas fa-arrows-alt-v\"></i>',\n class : 'gv-wheel-off',\n action : function (browser) {\n browser.setWheelAction('off');\n jQuery(this).addClass('gv-active').siblings().removeClass('gv-active');\n },\n }, {\n name : 'Mouse wheel to zoom in and out',\n icon : '&#177;',\n class : 'gv-wheel-zoom',\n action : function (browser) {\n browser.setWheelAction('zoom');\n jQuery(this).addClass('gv-active').siblings().removeClass('gv-active');\n },\n }],\n init: function (browser) {\n jQuery(this).find(`.gv-wheel-${browser.wheelAction}`).addClass('gv-active').siblings().removeClass('gv-active');\n },\n },\n ];\n\n if (this.saveable) {\n this.controls.push({\n icon : '<i class=\"fas fa-undo\"></i>',\n name : 'Reset tracks and configuration',\n action : (browser) => { browser.resetConfig(); },\n });\n }\n\n this.on({\n beforeInit: function () {\n const browser = this;\n\n this.tracksLibrary = (this.tracksLibrary || this.tracks).map(\n track => this.normaliseTrackDefinition(track)\n ).filter(\n track => track.prototype.name\n );\n\n const panel = jQuery(`\n <table cellspacing=0 cellpadding=0 class=\"gv\">\n <tr>\n <td class=\"gv-panel gv-panel-left\"></td>\n <td class=\"gv-canvas-container\"></td>\n <td class=\"gv-panel gv-panel-right\"></td>\n </tr>\n </table>\n `).appendTo(this.container).find('.gv-panel-right');\n\n this.controlPanel = panel;\n this.superContainer = this.container;\n this.container = jQuery('.gv-canvas-container', this.container);\n\n browser.controls.forEach(\n (control) => {\n const buttonSet = jQuery('<div class=\"gv-button-set\">').attr('title', control.name).appendTo(browser.superContainer.find('.gv-panel-right'));\n const buttons = control.buttons || [ control ];\n\n buttons.forEach(\n (button) => {\n const el = jQuery(`<button>${button.icon}</button>`).addClass(button.class).attr('title', button.name).appendTo(buttonSet);\n\n if (button.action) {\n el.on('click', () => {\n button.action.call(el[0], browser);\n });\n }\n\n if (button.init && button !== control) {\n button.init.call(el[0], browser);\n }\n }\n );\n\n if (control.init) {\n control.init.call(buttonSet, browser);\n }\n }\n );\n\n this.superContainer.width(this.width);\n\n // ESC key to toggle crosshair select to drag mode and close menus\n jQuery(document).on('keydown', (e) => {\n if (e.keyCode === 27) {\n if (panel.find('button.gv-drag-select').hasClass('gv-active')) {\n panel.find('button.gv-drag-scroll').trigger('click');\n }\n\n jQuery('.gv-menu .gv-close').trigger('click');\n }\n });\n },\n\n afterInit: function () {\n const browser = this;\n const tracksButton = jQuery('<button class=\"gv-tracks-library-button\" title=\"Tracks menu\"><i class=\"fas fa-bars\"></i> Tracks</button>').on('click', function () {\n const button = this;\n\n const getTrackTags = (track, tags) => (\n track.constructor?.ancestor?.prototype\n ? getTrackTags(track.constructor.ancestor.prototype, tags.concat(track.constructor.ancestor.prototype.tags || []))\n : tags\n );\n\n if (jQuery(this).hasClass('gv-active')) {\n jQuery('.gv-menu.gv-tracks-menu .gv-close').trigger('click');\n jQuery(this).removeClass('gv-active');\n } else {\n let menu = jQuery(this).data('menu');\n\n if (menu) {\n menu.show();\n } else {\n menu = browser.makeMenu({\n 'Currently enabled tracks:' : 'Available tracks:',\n '<div class=\"gv-current-tracks\"></div>' : '<input placeholder=\"Search\"><div class=\"gv-available-tracks\"></div>',\n }).addClass('gv-tracks-menu');\n\n jQuery('input[placeholder=Search]', menu).on('keyup', function () {\n const str = this.value.toLowerCase();\n\n jQuery('.gv-tracks-library-item', menu).each(function () {\n const track = jQuery(this).data('track');\n\n let match = false;\n\n if (track.name && track.name.toLowerCase().indexOf(str) >= 0) {\n match = true;\n } else {\n const tags = getTrackTags(track, []).concat(track.tags || []);\n\n if (tags.some(tag => tag.toLowerCase().indexOf(str) >= 0)) {\n match = true;\n }\n }\n\n jQuery(this)[match ? 'removeClass' : 'addClass']('gv-hide');\n });\n\n jQuery('.gv-tracks-library-category', menu).each(function () {\n const visibleTracks = jQuery(this).children('.gv-tracks-library-item:not(.gv-hide)');\n\n jQuery(this)[visibleTracks.length ? 'removeClass' : 'addClass']('gv-hide');\n });\n });\n\n jQuery('.gv-close', menu).on('click', () => {\n jQuery(button).removeClass('gv-active');\n });\n\n const availableTracks = jQuery('.gv-available-tracks', menu);\n const currentTracks = jQuery('.gv-current-tracks', menu).before('<div class=\"gv-current-tracks-instructions\">Drag and drop to reorder</div>').data({\n reload : function () { jQuery(this).empty().data('listTracks')(); },\n listTracks : function () {\n browser.tracks.filter(\n track => track.name && !(track.removable === false && track.unsortable) && !track.parentTrack && !track.lockToTrack\n ).forEach(\n (track) => {\n const el = jQuery('<div class=\"gv-tracks-menu-track\">')\n .append(`<span class=\"gv-tracks-menu-track-name\" title=\"${track.name}\">${track.defaultName}</span>`)\n .appendTo(currentTracks)\n .data('track', track)\n .addClass(track.unsortable ? 'gv-unsortable' : '');\n\n if (track.removable === false) {\n el.prepend('<i class=\"gv-remove-track gv-menu-button fas fa-circle\">');\n } else {\n el.prepend(jQuery('<i class=\"gv-remove-track gv-menu-button fas fa-times-circle\">').on('click', () => { track.remove(); }));\n }\n\n const trackNameEl = el.find('.gv-tracks-menu-track-name').tipsy({ gravity: 'w', trigger: 'manual' }).on('mouseenter', function () {\n const tip = jQuery(this).tipsy('show').data('tipsy').$tip;\n\n if (tip) {\n tip.css('zIndex', 1002);\n }\n }).on('mouseleave', function () {\n jQuery(this).tipsy('hide');\n });\n\n if (track.name === track.defaultName) {\n trackNameEl.tipsy('disable');\n }\n }\n );\n },\n }).sortable({\n items : 'div:not(.gv-unsortable)',\n cursor : 'move',\n axis : 'y',\n handle : 'span',\n update : browser.updateTrackOrder.bind(browser),\n start : function () {\n currentTracks.find('.gv-tracks-menu-track-name').each(function () { jQuery(this).tipsy('hide').tipsy('disable'); });\n },\n stop: function () {\n currentTracks.find('.gv-tracks-menu-track-name').each(function () { jQuery(this).tipsy('enable'); });\n },\n });\n\n currentTracks.data('listTracks')();\n\n if (browser.saveable) {\n jQuery('<div class=\"gv-tracks-menu-reset gv-menu-button\"><i class=\"fas fa-undo\"></i> Reset tracks and configuration</div>').insertAfter(currentTracks).on('click', (e) => {\n e.preventDefault();\n browser.resetConfig();\n });\n }\n\n if (browser.tracksLibrary?.length) {\n const tracksLibraryCategories = browser.tracksLibrary.filter(track => track.prototype.name && track.prototype.removable !== false).reduce(\n (acc, track) => {\n const categoryName = track.prototype.category || '';\n\n acc[categoryName] = acc[categoryName] || [];\n acc[categoryName].push([ track.prototype.name.toLowerCase(), track ]);\n\n return acc;\n },\n {}\n );\n\n const tracksLibraryCategoryOrder = (pluginConf?.tracksLibraryCategoryOrder || []).reduce(\n (acc, categoryName, i) => Object.assign(acc, { [categoryName]: i + 1 }),\n {}\n );\n\n Object.keys(tracksLibraryCategories).sort((a, b) => (Boolean(b) - Boolean(a)) || (tracksLibraryCategoryOrder[a] - tracksLibraryCategoryOrder[b]) || a.localeCompare(b)).forEach(\n (categoryName, i, allCategoryNames) => {\n const parentEl = (\n allCategoryNames.length > 1\n ? jQuery('<div class=\"gv-tracks-library-category\">').append(\n jQuery('<div class=\"gv-tracks-library-category-header\">').html(categoryName || 'Other')\n ).appendTo(availableTracks)\n : availableTracks\n );\n\n tracksLibraryCategories[categoryName].sort((a, b) => a[0].localeCompare(b[0])).forEach(\n (row) => {\n const track = row[1];\n\n jQuery('<div class=\"gv-tracks-library-item\">').append(\n jQuery('<i class=\"gv-add-track gv-menu-button fas fa-plus-circle\">').on('click', () => {\n browser.trackIds = browser.trackIds || {};\n browser.trackIds[track.prototype.id] = browser.trackIds[track.prototype.id] || 1;\n\n browser.addTrack(track.extend({ id: `${track.prototype.id}${browser.tracksById[track.prototype.id] ? browser.trackIds[track.prototype.id]++ : ''}` }));\n })\n ).append(`<span>${track.prototype.name}</span>`).appendTo(parentEl).data('track', track.prototype);\n }\n );\n }\n );\n }\n\n menu.css({ left: '50%', marginLeft: menu.width() / -2 });\n\n jQuery(this).data('menu', menu);\n }\n\n jQuery(this).addClass('gv-active');\n }\n });\n\n this.labelContainer.prepend(\n jQuery('<li class=\"gv-unsortable\">').append(\n jQuery('<div class=\"gv-button-set\" title=\"Tracks menu\">').append(tracksButton)\n )\n );\n },\n\n afterAddDomElements: function () {\n this.wrapper.after('<div class=\"gv-powered-by\">Powered by <a target=\"_blank\" href=\"https://github.com/DECIPHER-genomics/Genoverse\">Genoverse</a></div>');\n this.superContainer.find('.gv-panel-left').append(this.labelContainer);\n },\n\n 'afterAddTracks afterRemoveTracks': function () {\n const currentTracks = this.superContainer.find('.gv-tracks-menu .gv-current-tracks');\n\n if (currentTracks.length) {\n currentTracks.data('reload').call(currentTracks);\n }\n },\n });\n\n this.on({\n afterSetName: function (name) {\n const track = this.track;\n\n if (track?.browser) {\n const menu = track.browser.superContainer.find('.gv-tracks-library-button').data('menu');\n\n if (menu) {\n menu.find('.gv-tracks-menu-track').filter(function () {\n return jQuery(this).data('track') === track;\n }).children('.gv-tracks-menu-track-name').attr('title', name).each(function () {\n if (name === track.defaultName) {\n jQuery(this).tipsy('hide').tipsy('disable');\n } else {\n jQuery(this).tipsy('enable');\n }\n });\n }\n }\n },\n }, 'tracks');\n};\n\nexport default { controlPanel: plugin, requires: karyotype };\n","import '../../css/karyotype.css';\nimport Chromosome from '../Track/library/Chromosome';\n\nconst plugin = function (pluginConf) {\n const jQuery = this.jQuery;\n\n function createKaryotype() {\n const chromosome = jQuery('<div class=\"gv-chromosome\">');\n const container = jQuery('<div class=\"gv-karyotype-container\">').html(chromosome).insertBefore(this.wrapper);\n const assemblyName = this.assembly || this.genomeName;\n const name = `${pluginConf.showAssembly && assemblyName ? `${assemblyName}: ` : ''}Chr ${this.chr}`;\n\n if (pluginConf.showAssembly && assemblyName) {\n container.addClass('gv-show-assembly');\n }\n\n const measureWidth = jQuery(`<div class=\"gv-chromosome\"><ul class=\"gv-label-container\"><li><span class=\"gv-name\">${name}</span></li></ul></div>`).appendTo(container);\n const labelWidth = pluginConf.karyotypeLabel === false ? 0 : measureWidth.find('.gv-name').outerWidth(true) + 10;\n\n measureWidth.remove();\n\n this.karyotype = new Genoverse({\n parent : this,\n container : chromosome,\n width : chromosome.width(),\n genome : this.genome,\n chr : this.chr,\n start : 1,\n end : this.chromosomeSize,\n isStatic : true,\n tracks : [\n Chromosome.extend({\n name : name,\n height : 20,\n featureHeight : 20,\n border : false,\n legend : false,\n unsortable : true,\n\n click: function (e) {\n const offset = this.container.parent().offset().left;\n const x = e.pageX - offset;\n const f = this.featurePositions.search({ x: x, y: 1, w: 1, h: 1 })[0];\n\n if (f) {\n if (e.type === 'mouseup') {\n if (!this.browser.parent.isStatic) {\n this.browser.parent.moveTo(f.chr, f.start, f.end, true);\n }\n } else if (this.hoverFeature !== f && !this.browser.hideTooltip) {\n this.container.tipsy('hide');\n\n if (f.label) {\n const left = offset + f.position[this.scale].start + f.position[this.scale].width / 2;\n\n this.container.attr('title', f.label[0]).tipsy({ trigger: 'manual', container: 'body' }).tipsy('show').data('tipsy').$tip.css('left', function () { return left - jQuery(this).width() / 2; });\n }\n\n this.hoverFeature = f;\n }\n }\n },\n\n addUserEventHandlers: function () {\n const track = this;\n\n this.base();\n\n this.container.on({\n mousemove : (e) => { track.click(e); },\n mouseout : (e) => {\n if (track.browser.viewPoint.is(e.relatedTarget) || track.browser.viewPoint.find(e.relatedTarget).length) {\n return true;\n }\n\n track.container.tipsy('hide');\n track.hoverFeature = false;\n },\n }, '.gv-image-container');\n\n // Don't allow zooming in and out on the karyotype image\n this.container.on('mousewheel', '.gv-image-container, .gv-selector', (e) => {\n e.stopPropagation();\n });\n },\n\n afterSetName: function () {\n this.label.css('lineHeight', `${this.label.height()}px`);\n },\n }),\n ],\n\n addUserEventHandlers: () => {},\n\n afterInit: function () {\n this.updatePosition();\n this.viewPoint.fadeIn();\n },\n\n afterAddTracks: function () {\n this.track = this.tracks[0];\n },\n\n afterAddDomElements: function () {\n const karyotype = this;\n const parent = this.parent;\n\n function hideTooltip() {\n karyotype.hideTooltip = true;\n karyotype.track.prop('container').tipsy('hide');\n }\n\n function updateLocation(e, ui) {\n karyotype.hideTooltip = false;\n\n const scale = karyotype.chromosomeSize / karyotype.width;\n const axis = e.type === 'resizestop' ? jQuery(this).data('ui-resizable').axis : undefined;\n const start = axis === 'e' ? parent.start : Math.max(Math.floor(ui.position.left * scale), 1);\n const end = axis === 'w' ? parent.end : e.type === 'dragstop' ? start + parent.length - 1 : Math.floor(ui.helper.outerWidth(true) * scale) + start;\n\n if (start !== parent.start || end !== parent.end) {\n parent.moveTo(karyotype.chr, start, end, true, e.type === 'dragstop');\n }\n }\n\n if (pluginConf.karyotypeLabel === false) {\n this.labelContainer.remove();\n this.labelContainer = jQuery();\n container.addClass('gv-no-label');\n } else {\n this.labelContainer.width(labelWidth);\n }\n\n this.viewPoint = jQuery('<div class=\"gv-karyotype-viewpoint-wrapper\"><div class=\"gv-karyotype-viewpoint\"></div></div>').appendTo(container).css({\n left : labelWidth,\n width : this.width - labelWidth,\n }).children().on({\n mousemove : (e) => { karyotype.track.controller.click(e); },\n mouseout : (e) => {\n const el = jQuery(e.relatedTarget);\n\n if (karyotype.viewPoint.is(el) || karyotype.viewPoint.find(el).length || (el.prop('nodeName') === 'IMG' && el.parent().is(karyotype.track.prop('imgContainers')[0]))) {\n return true;\n }\n\n karyotype.track.prop('container').tipsy('hide');\n karyotype.track.prop('hoverFeature', false);\n },\n });\n\n if (!parent.isStatic) {\n this.viewPoint.draggable({\n axis : 'x',\n containment : this.wrapper,\n start : hideTooltip,\n stop : updateLocation,\n }).resizable({\n handles : 'e, w',\n containment : 'parent',\n start : hideTooltip,\n stop : updateLocation,\n resize : function (e, ui) {\n ui.element.css('left', Math.max(0, ui.position.left));\n\n if (ui.position.left > 0) {\n ui.element.width(Math.min(ui.size.width, ui.element.parent().width() - ui.position.left));\n } else {\n ui.element.width(ui.size.width + ui.position.left);\n }\n },\n });\n }\n },\n\n updatePosition: function () {\n const left = this.parent.start * this.scale;\n const width = (this.parent.end * this.scale) - left;\n\n this.viewPoint.css({ left: left, width: width });\n },\n });\n\n if (this.loadedPlugins.controlPanel !== true) {\n jQuery('<li class=\"gv-unsortable\">').height((i, h) => h + container.height()).prependTo(this.labelContainer);\n }\n }\n\n function recreateKaryotype() {\n const container = this.karyotype.container.parent();\n\n this.karyotype.destroy();\n container.remove();\n\n createKaryotype.call(this);\n }\n\n this.on({\n afterInit: createKaryotype,\n\n afterSetRange: function () {\n if (this.karyotype) {\n this.karyotype.updatePosition();\n }\n },\n\n afterSetWidth: recreateKaryotype,\n\n afterMoveTo: function (chr) {\n if (this.karyotype && this.karyotype.chr !== chr) {\n recreateKaryotype.call(this);\n }\n },\n });\n};\n\nexport default { karyotype: plugin };\n"],"names":["controlPanel","pluginConf","jQuery","this","controls","name","buttons","icon","class","init","browser","el","find","on","mousedown","startDragScroll","mouseup","stopDragScroll","mousehold","move","scrollDelta","action","zoomIn","zoomOut","setDragAction","addClass","siblings","removeClass","dragAction","setWheelAction","wheelAction","saveable","push","resetConfig","beforeInit","tracksLibrary","tracks","map","track","normaliseTrackDefinition","filter","prototype","panel","appendTo","container","superContainer","forEach","control","buttonSet","attr","button","call","width","document","e","keyCode","hasClass","trigger","afterInit","tracksButton","getTrackTags","tags","constructor","ancestor","concat","menu","data","show","makeMenu","str","value","toLowerCase","each","match","indexOf","some","tag","visibleTracks","children","length","availableTracks","currentTracks","before","reload","empty","listTracks","removable","unsortable","parentTrack","lockToTrack","append","defaultName","prepend","remove","trackNameEl","tipsy","gravity","tip","$tip","css","sortable","items","cursor","axis","handle","update","updateTrackOrder","bind","start","stop","insertAfter","preventDefault","tracksLibraryCategories","reduce","acc","categoryName","category","tracksLibraryCategoryOrder","i","Object","assign","keys","sort","a","b","Boolean","localeCompare","allCategoryNames","parentEl","html","row","trackIds","id","addTrack","extend","tracksById","left","marginLeft","labelContainer","afterAddDomElements","wrapper","after","afterSetName","requires","karyotype","createKaryotype","chromosome","insertBefore","assemblyName","assembly","genomeName","showAssembly","chr","measureWidth","labelWidth","karyotypeLabel","outerWidth","Genoverse","parent","genome","end","chromosomeSize","isStatic","Chromosome","height","featureHeight","border","legend","click","offset","x","pageX","f","featurePositions","search","y","w","h","type","moveTo","hoverFeature","hideTooltip","label","position","scale","addUserEventHandlers","base","mousemove","mouseout","viewPoint","is","relatedTarget","stopPropagation","updatePosition","fadeIn","afterAddTracks","prop","updateLocation","ui","undefined","Math","max","floor","helper","controller","draggable","containment","resizable","handles","resize","element","min","size","loadedPlugins","prependTo","recreateKaryotype","destroy","afterSetRange","afterSetWidth","afterMoveTo"],"sourceRoot":""}