@galaxyproject/igv 0.0.16 → 0.0.17
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/package.json +1 -1
- package/static/index.js +1 -1
package/package.json
CHANGED
package/static/index.js
CHANGED
|
@@ -2449,4 +2449,4 @@ ${l.map(p=>` ${p}`).join(`
|
|
|
2449
2449
|
`)}`);const d=a.filter(p=>p.file===void 0);let u=1;for(let p of d)p.order===void 0&&(p.order=u++);const f=d.filter(p=>p.hidden===!0);for(const p of f)await ji(p,this.genome).getFeatures({chr:"1",start:0,end:Number.MAX_SAFE_INTEGER});await this.loadTrackList(d)}cleanHouseForSession(){for(let t of this.trackViews)t.removeDOMFromColumnContainer();this.columnContainer.querySelectorAll(".igv-axis-column, .igv-column-shim, .igv-column, .igv-sample-info-column, .igv-sample-name-column, .igv-scrollbar-column, .igv-track-drag-column, .igv-gear-menu-column").forEach(t=>t.remove()),this.trackViews=[],this.circularView&&this.circularView.clearChords()}async loadReference(e,t){this.removeAllTracks(),this.roiManager.clearROIs(),this.navbar.setEnableTrackSelection(!1);let r;e.gbkURL?r=await z_(e.gbkURL):r=await Xm.createGenome(e,this);const n=this.genome===void 0||this.genome.id!==r.id;this.genome=r,this.navbar.updateGenome(r);let o=t||r.initialLocus;return Array.isArray(o)&&(o=o.join(" ")),await this.search(o,!0)||(console.error(`Cannot set initial locus ${o}`),o!==r.initialLocus&&await this.search(r.initialLocus)),n&&(this.fireEvent("genomechange",[{genome:r}]),this.circularView&&this.circularView.setAssembly({name:this.genome.id,id:this.genome.id,chromosomes:wF(this.genome)})),r}async loadGenome(e){e.genarkAccession&&(e.url=$_(e.genarkAccession)),e.url&&(Yt(e.url)&&e.url.endsWith("/hub.txt")?(e.hubURL=e.url,delete e.url):JZ(e.url)==="gbk"&&(e.gbkURL=e.url,delete e.url));let t;e.hubURL||e.url&&Yt(e.url)&&e.url.endsWith("/hub.txt")?t=(await mu(e.hubURL||e.url)).getGenomeConfig():Yt(e)||!(e.url||e.fastaURL||e.twoBitURL||e.gbkURL)?t=await ci.expandReference(this.alert,e):t=e,await this.loadReference(t);let n;return t.gbkURL||t.format==="gbk"?n=[{name:"Annotations",format:"gbk",url:t.gbkURL}]:n=t.tracks||[],n.filter(s=>s.type==="sequence").length===0&&n.push({type:"sequence",order:gu}),await this.loadTrackList(n),this.genome}updateUIWithReferenceFrameList(){const e=this.referenceFrameList;this.isMultiLocusWholeGenomeView()||ci.isWholeGenomeView(e[0].chr),this.navbar.navbarDidResize(),Ag(this.trackViews,this.doShowTrackLabels),this.doShowCenterLine&&ci.isWholeGenomeView(e[0].chr)&&this.navbar.centerLineButton.boundMouseClickHandler(),this.doShowCursorGuide&&ci.isWholeGenomeView(e[0].chr)&&this.navbar.cursorGuideButton.boundMouseClickHandler(),this.setCenterLineAndCenterLineButtonVisibility(ci.isWholeGenomeView(e[0].chr))}setCenterLineAndCenterLineButtonVisibility(e){e?this.navbar.centerLineButton.setVisibility(!1):this.navbar.centerLineButton.setVisibility(this.config.showCenterGuideButton);for(let t of this.centerLineList)e?this.setCenterLineVisibility(!e):this.setCenterLineVisibility(this.doShowCenterLine)}setTrackLabelVisibility(e){Ag(this.trackViews,e)}setROITableVisibility(e){e===!0?this.roiManager.presentTable():this.roiManager.dismissTable()}setCursorGuideVisibility(e){e?this.cursorGuide.show():this.cursorGuide.hide()}setCustomCursorGuideMouseHandler(e){this.cursorGuide.customMouseHandler=e}setCenterLineVisibility(e){for(let t of this.centerLineList)e===!0?(t.show(),t.repaint()):t.hide()}async loadTrackList(e){let t=this.trackViews.length+1;for(let o of e)o.order===void 0&&(o.order=t++);const r=[];for(const o of e)r.push(at(this,Bu,OA).call(this,o));const n=await Promise.all(r);return this.trackViews.some(({track:o})=>o.selected)&&this.navbar.setEnableTrackSelection(!0),this.reorderTracks(),await hd.call(this),this.fireEvent("trackorderchanged",[this.getTrackOrder()]),n}async loadTrack(e){const t=await this.loadTrackList([e]);return e.autoscaleGroup&&this.updateViews(),t[0]}async addTrack(e){e.order===void 0&&(e.order=this.trackViews.length);const t=new Kp(this,this.columnContainer,e);if(this.trackViews.push(t),Ag(this.trackViews,this.doShowTrackLabels),typeof e.postInit=="function")try{t.startSpinner(),await e.postInit()}finally{t.stopSpinner()}return typeof e.hasSamples=="function"&&e.hasSamples()&&(this.sampleInfo.hasAttributes()&&this.sampleInfoControl.setButtonVisibility(!0),this.config.showSampleNameButton!==!1&&this.sampleNameControl.show()),e.trackView.enableTrackSelection(this.navbar.getEnableTrackSelection()),e}async loadROI(e){return this.roiManager.loadROI(e,this.genome)}clearROIs(){this.roiManager.clearROIs()}async getUserDefinedROIs(){if(this.roiManager){const e=this.roiManager.getUserDefinedROISet();if(e===void 0)return[];const t=await e.getAllFeatures(),r=[];for(let n of Object.values(t))r.push(...n);return r}else return[]}getRulerTrackView(){const e=this.trackViews.filter(({track:t})=>t.id==="ruler");return e.length>0?e[0]:void 0}async createTrack(e){let t=await Sz(e.url||e.fastaURL);if(Yt(t)&&(t=t.trim()),t)if(e.format)e.format=e.format.toLowerCase();else if(e.fastaURL)e.format="fasta";else if(e.sourceType)e.sourceType==="htsget"&&await f2.inferFormat(e);else{const o=await ux(e);o&&(e.format=o)}e.type&&ox(e);let r=e.type?e.type.toLowerCase():void 0;if(!r){if(e.format){if(e.format==="hic"){const o=new DA(e);if(await o.readHeaderAndFooter(),o.chromosomeIndexMap.celltype)r="shoebox",e._hicFile=o;else throw Error("'.hic' files not supported")}else if(r=nx(e.format),r==="bedtype"){const o=ji(e,this.genome);e._featureSource=o;const s=await o.trackType();s&&IX().has(s)?r=s:r="annotation"}}else throw Error(`Unrecognized track: ${JSON.stringify(e)}`);e.type=r}if(this.trackDefaults&&r){const o=this.trackDefaults[r];if(o)for(let s in o)o.hasOwnProperty(s)&&e[s]===void 0&&(e[s]=o[s])}const n=EX(r,e,this);if(n===void 0)this.alert.present(new Error(`Error creating track. Could not determine track type for file: ${e.url||e}`),void 0);else return e.roi&&e.roi.length>0&&(n.roiSets=e.roi.map(o=>new vZ(o,this.genome))),n}reorderTracks(){this.trackViews.sort(function(t,r){const n=a=>a.track.id==="ideogram"?1:a.track.id==="ruler"?2:3,o=n(t),s=n(r);if(o===s){const a=t.track.order||0,c=r.track.order||0;return a-c}else return o-s});for(let{axis:t,viewports:r,sampleInfoViewport:n,sampleNameViewport:o,outerScroll:s,dragHandle:a,gearContainer:c}of this.trackViews){t.remove();for(let{viewportElement:l}of r)l.parentNode.removeChild(l);n.viewport.remove(),o.viewport.remove(),s.remove(),a.remove(),c.remove()}const e=this.columnContainer.querySelectorAll(".igv-column");for(let{axis:t,viewports:r,sampleInfoViewport:n,sampleNameViewport:o,outerScroll:s,dragHandle:a,gearContainer:c}of this.trackViews){this.columnContainer.querySelector(".igv-axis-column").appendChild(t);for(let l=0;l<e.length;l++){const{viewportElement:h}=r[l];e[l].appendChild(h)}this.columnContainer.querySelector(".igv-sample-info-column").appendChild(n.viewport),this.columnContainer.querySelector(".igv-sample-name-column").appendChild(o.viewport),this.columnContainer.querySelector(".igv-scrollbar-column").appendChild(s),this.columnContainer.querySelector(".igv-track-drag-column").appendChild(a),this.columnContainer.querySelector(".igv-gear-menu-column").appendChild(c)}}getTrackOrder(){return this.trackViews.filter(e=>e.track&&e.track.name).map(e=>e.track.name)}getSelectedTrackViews(){return this.trackViews.filter(e=>e.track.selected===!0)}removeTrackByName(e){const t=this.trackViews.slice();for(let r of t)e===r.track.name&&this.removeTrack(r.track)}removeTrack(e){for(let t of this.trackViews)if(e===t.track){this._removeTrack(t.track);break}}_removeTrack(e){e.disposed||(this.trackViews.splice(this.trackViews.indexOf(e.trackView),1),this.fireEvent("trackremoved",[e]),this.fireEvent("trackorderchanged",[this.getTrackOrder()]),e.trackView&&e.trackView.dispose())}removeAllTracks(){const e=this.trackViews;this.trackViews=[];for(let t of e)t.track.id!=="ruler"&&t.track.id!=="ideogram"?(this.fireEvent("trackremoved",[t.track]),t.dispose()):this.trackViews.push(t)}get ideogramTrackView(){return this.trackViews[0]}get rulerTrackView(){return this.trackViews[1]}findTracks(e,t){let r=typeof e=="function"?n=>e(n.track):n=>t===n.track[e];return this.trackViews.filter(r).map(n=>n.track)}get tracks(){return this.trackViews.map(e=>e.track).filter(e=>e!==void 0)}setTrackHeight(e){this.trackHeight=e,this.trackViews.forEach(function(t){t.setTrackHeight(e)})}async visibilityChange(){this.layoutChange()}async layoutChange(){if(this.referenceFrameList.find(t=>t.bpPerPixel<0)){const t=this.calculateViewportWidth(this.referenceFrameList.length);for(let r of this.referenceFrameList)r.bpPerPixel=(r.end-r.start)/t}this.referenceFrameList&&this.navbar.navbarDidResize(),hd.call(this),this.roiManager.updateROIRegionPositions(),await this.updateViews()}async updateViews(){const e=this.trackViews;this.updateLocusSearchWidget();for(const{bpPerPixel:t,chr:r,start:n}of this.referenceFrameList)t<=b2&&await this.genome.getSequence(r,n,n+1);for(const t of this.centerLineList)t.repaint();if(this.dragObject)for(const t of e)await t.updateViews();else{const t={},r=[];for(const n of e)if(n.track.autoscaleGroup){const o=n.track.autoscaleGroup;t[o]||(t[o]=[]),t[o].push(n)}else r.push(n);if(Object.entries(t).length>0)for(const[n,o]of Object.entries(t)){const s=await Promise.all(o.map(c=>c.getInViewFeatures())),a=Sc(s.flat());for(const c of o)c.track.dataRange=Object.assign({},a),c.track.autoscale=!1;await Promise.all(o.map(c=>c.updateViews()))}await Promise.all(r.map(n=>n.updateViews()))}}repaintViews(){for(let e of this.trackViews)e.repaintViews()}updateLocusSearchWidget(){if(!this.referenceFrameList)return;const e=this.referenceFrameList,t=this.calculateViewportWidth(this.referenceFrameList.length);for(let o of e)o.end=o.start+o.bpPerPixel*t;const r=this.referenceFrameList.map(o=>o.getLocusString()).join(" "),n=e.length===1?this.genome.getChromosomeDisplayName(this.referenceFrameList[0].chr):"";this.navbar.updateLocus(r,n),this.fireEvent("locuschange",[this.referenceFrameList])}calculateViewportWidth(e){let{width:t}=this.columnContainer.getBoundingClientRect();return t-=yj+this.getSampleInfoViewportWidth()+this.getSampleNameViewportWidth()+KZ+YZ+XZ,t-=ZZ*(e-1),Math.floor(t/e)}updateReferenceFrames(e){for(const t of this.referenceFrameList)t.updateForViewportWidth(e)}updateViewportElements(e){for(let t=0;t<this.referenceFrameList.length;t++){for(const{viewports:r}of this.trackViews)r[t].setWidth(e);for(const{sampleInfoViewport:r}of this.trackViews)r.setWidth(this.getSampleInfoColumnWidth()),r.repaint()}}async syncUIState(){this.updateUIWithReferenceFrameList(),await this.updateViews(!0)}minimumBases(){return this.config.minimumBases}zoomIn(){this.zoomWithScaleFactor(.5)}zoomOut(){this.zoomWithScaleFactor(2)}async zoomWithScaleFactor(e,t,r){if(!this.referenceFrameList)return;const n=this.calculateViewportWidth(this.referenceFrameList.length);let o=r?[r]:this.referenceFrameList;for(let s of o)s.zoomWithScaleFactor(this,e,n,t)}async addMultiLocusPanel(e,t,r,n){if(!this.referenceFrameList)return;const o=this.calculateViewportWidth(1+this.referenceFrameList.length),s=this.calculateViewportWidth(this.referenceFrameList.length)/this.calculateViewportWidth(1+this.referenceFrameList.length);for(let f of this.referenceFrameList)f.bpPerPixel*=s;const a=(r-t)/o,c=new SA(this.genome,e,t,r,a),l=n?this.referenceFrameList.indexOf(n):this.referenceFrameList.length-1,h=1+l,{viewportElement:d}=this.trackViews[0].viewports[l],u=Fg.insertAfter(d.parentElement);if(this.fireEvent("didchangecolumnlayout"),h===this.referenceFrameList.length){this.referenceFrameList.push(c);for(let f of this.trackViews){const p=Dm(f,u,c);f.viewports.push(p)}}else{this.referenceFrameList.splice(h,0,c);for(let f of this.trackViews){const p=Dm(f,u,c);f.viewports.splice(h,0,p)}}this.centerLineList=this.createCenterLineList(this.columnContainer),hd.call(this),await this.updateViews(!0)}createCenterLineList(e){const t=e.querySelectorAll(".igv-center-line");for(let o=0;o<t.length;o++)t[o].remove();const r=[],n=e.querySelectorAll(".igv-column");for(let o=0;o<n.length;o++)r.push(new fZ(this,this.referenceFrameList[o],n[o]));return r}async removeMultiLocusPanel(e){const t=this.referenceFrameList.indexOf(e),{viewportElement:r}=this.trackViews[0].viewports[t];Fg.removeColumnAtIndex(t,r.parentElement),this.fireEvent("didchangecolumnlayout");for(let{viewports:o}of this.trackViews)o[t].dispose(),o.splice(t,1);if(this.referenceFrameList.splice(t,1),this.referenceFrameList.length===1&&this.getRulerTrackView())for(let o of this.getRulerTrackView().viewports)o.dismissLocusLabel();const n=this.calculateViewportWidth(1+this.referenceFrameList.length)/this.calculateViewportWidth(this.referenceFrameList.length);await this.rescaleForMultiLocus(n)}async gotoMultilocusPanel(e){const t=this.referenceFrameList.indexOf(e);this.columnContainer.querySelectorAll(".igv-column").forEach((n,o)=>{o===t||n.remove()}),this.columnContainer.querySelectorAll(".igv-column-shim").forEach(n=>n.remove());for(let n of this.trackViews){const o=n.viewports[t];n.viewports.filter((s,a)=>a!==t).forEach(s=>s.dispose()),n.viewports=[o]}const r=this.calculateViewportWidth(1);e.bpPerPixel=(e.end-e.start)/r,this.referenceFrameList=[e],this.trackViews.forEach(({viewports:n})=>n.forEach(o=>o.setWidth(r))),this.centerLineList=this.createCenterLineList(this.columnContainer),this.updateUIWithReferenceFrameList(),await this.updateViews(!0)}async rescaleForMultiLocus(e){const t=this.calculateViewportWidth(this.referenceFrameList.length);for(let r of this.referenceFrameList)r.bpPerPixel*=e;for(let{viewports:r}of this.trackViews)for(let n of r)n.setWidth(t);this.centerLineList=this.createCenterLineList(this.columnContainer),this.updateUIWithReferenceFrameList(),await this.updateViews()}async goto(e,t,r){await this.search(e+":"+t+"-"+r)}async search(e,t){const r=await dX(this,e);return this.updateLoci(r,t)}async updateLoci(e,t){if(e&&e.length>0){this.referenceFrameList=RX(e,this.genome,this.flanking,this.minimumBases(),this.calculateViewportWidth(e.length),this.isSoftclipped());for(let r of this.trackViews)r.removeViewportsFromColumnContainer();this.columnContainer.querySelectorAll(".igv-column-shim, .igv-column").forEach(r=>r.remove()),Fg.insertBefore(this.columnContainer.querySelector(".igv-sample-info-column"),this.referenceFrameList.length),this.fireEvent("didchangecolumnlayout");for(let r of this.trackViews)r.createViewports(this,this.columnContainer,this.referenceFrameList);return this.centerLineList=this.createCenterLineList(this.columnContainer),this.updateUIWithReferenceFrameList(),t||await this.updateViews(),!0}else return!1}async loadSampleInfo(e){await this.sampleInfo.loadSampleInfo(e),this.config.sampleinfo?this.config.sampleinfo.push(e):this.config.sampleinfo=[e];for(const{sampleInfoViewport:r}of this.trackViews)r.setWidth(this.getSampleInfoColumnWidth());this.findTracks(r=>typeof r.getSamples=="function").length>0&&(this.sampleInfoControl.performClickWithState(this,!0),this.sampleInfoControl.setButtonVisibility(!0));for(const{sampleInfoViewport:r}of this.trackViews)r.repaint()}async discardSampleInfo(){this.sampleInfo.discard();for(const{sampleInfoViewport:t}of this.trackViews)t.setWidth(this.getSampleInfoColumnWidth());this.findTracks(t=>typeof t.getSamples=="function").length>0&&(this.sampleInfoControl.performClickWithState(this,!1),this.sampleInfoControl.setButtonVisibility(!1));for(const{sampleInfoViewport:t}of this.trackViews)t.repaint();await this.layoutChange()}getSampleInfoColumnWidth(){if(this.sampleInfo.attributeCount){const t=this.findTracks(s=>typeof s.getSamples=="function").length>0,r=this.sampleInfo.hasAttributes(),n=this.sampleInfoControl.showSampleInfo;return t&&r&&n?this.sampleInfo.attributeCount*ea+zm:0}else return 0}on(e,t){this.eventHandlers[e]||(this.eventHandlers[e]=[]),this.eventHandlers[e].push(t)}un(e,t){this.off(e,t)}off(e,t){if(!e)this.eventHandlers={};else if(!t)this.eventHandlers[e]=[];else{const r=this.eventHandlers[e];if(!r||r.length===0)console.warn("No handlers to remove for event: "+e);else{const n=r.indexOf(t);n!==-1&&this.eventHandlers[e].splice(n,1)}}}fireEvent(e,t,r){const n=this.eventHandlers[e];if(n===void 0||n.length===0)return;const o=r||window;return n.map(function(a){return a.apply(o,t)})[0]}dispose(){this.removeEventHandlers();for(let e of this.trackViews)e.dispose();this.roiManager&&this.roiManager.dispose()}toJSON(){const e={version:IA()};if(this.showSampleNames!==void 0&&(e.showSampleNames=this.showSampleNames),this.sampleNameViewportWidth&&(e.sampleNameViewportWidth=this.sampleNameViewportWidth),e.reference=this.genome.toJSON(),e.reference.fastaURL instanceof File)throw new Error(`Error. Sessions cannot include local file references ${e.reference.fastaURL.name}.`);if(e.reference.indexURL instanceof File)throw new Error(`Error. Sessions cannot include local file references ${e.reference.indexURL.name}.`);const t=[];let r=this.trackViews[0];for(let{referenceFrame:l}of r.viewports){const h=l.getLocusString();t.push(h)}e.locus=t.length===1?t[0]:t;const n=this.roiManager.toJSON();n&&(e.roi=n,this.roiManager.showOverlays||(e.showROIOverlays=!1)),this.qtlSelections.isEmpty()||(e.qtlSelections=this.qtlSelections.toJSON());const o=[],s=[];for(const{track:l}of this.trackViews)try{let h;typeof l.getState=="function"?h=Qt.localFileInspection(l.getState()):l.config&&(h=Qt.localFileInspection(l.config)),h&&(h.browser&&delete h.browser,h.order=l.order,o.push(h))}catch(h){const d=`Track: ${l.name}: ${h}`;console.error(d),s.push(d)}if(s.length>0){let l=1,h="Errors encountered saving session: </br>";for(let d of s)h+=` (${l++}) ${d.toString()} <br/>`;throw Error(h)}e.tracks=o;const a=[];for(const l of o)for(const h of Object.keys(l))(h==="file"||h==="indexFile")&&a.push(l[h]);const c=[];if(this.config.sampleinfo){e.sampleinfo=this.config.sampleinfo;for(const l of this.sampleInfo.sampleInfoFiles){const h=Qt.localFileInspection({url:l});h.file&&c.push(h.file)}c.length>0&&a.push(...c)}return a.length>0&&alert(`This session includes reference(s) to local file(s):
|
|
2450
2450
|
${a.map(l=>` ${l}`).join(`
|
|
2451
2451
|
`)}
|
|
2452
|
-
Local files cannot be loaded automatically when a saved session is restored.`),e}compressedSession(){const e=JSON.stringify(this.toJSON());return dO(e)}sessionURL(){const e=window.location.href.slice(),t=e.indexOf("?");return(t>0?e.substring(0,t):e)+"?sessionURL=blob:"+this.compressedSession()}mouseDownOnViewport(e,t){var r;r=gc(e),this.vpMouseDown={viewport:t,lastMouseX:r.x,mouseDownX:r.x,lastMouseY:r.y,mouseDownY:r.y,referenceFrame:t.referenceFrame}}cancelTrackPan(){const e=this.dragObject;this.dragObject=void 0,this.isScrolling=!1,this.vpMouseDown=void 0,e&&e.viewport.referenceFrame.start!==e.start&&(this.updateViews(),this.fireEvent("trackdragend",[e.viewport]))}isTrackPanning(){return this.dragObject}isSoftclipped(){return this.trackViews.find(t=>t.track.showSoftClips===!0)!==void 0}startTrackDrag(e){this.dragTrack=e}updateTrackDrag(e){if(e&&this.dragTrack){const t=this.dragTrack,r=this.trackViews.indexOf(e),n=this.trackViews.indexOf(t),o=this.trackViews;o[r]=t,o[n]=e;const s=this.trackViews[r].track.order;this.trackViews[n].track.order=s;const a=o.length;let c=s;if(r<n)for(let l=r+1;l<a;l++){const h=o[l].track;if(h.order<=c)h.order=Math.min(Number.MAX_SAFE_INTEGER,c+1),c=h.order;else break}else for(let l=r-1;l>0;l--){const h=o[l].track;if(h.order>=c)h.order=Math.max(-Number.MAX_SAFE_INTEGER,c-1),c=h.order;else break}this.reorderTracks()}}endTrackDrag(){this.dragTrack?(this.dragTrack=void 0,this.fireEvent("trackorderchanged",[this.getTrackOrder()])):this.dragTrack=void 0}addEventHandlers(){this.addWindowResizeHandler(),this.addRootMouseUpHandler(),this.addRootMouseLeaveHandler(),this.addColumnContainerEventHandlers(),this.addKeyboardHandler()}removeEventHandlers(){this.removeWindowResizeHandler(),this.removeRootMouseUpHandler(),this.removeRootMouseLeaveHandler(),this.removeColumnContainerEventHandlers(),this.removeKeyboardHandler()}addWindowResizeHandler(){this.boundWindowResizeHandler=hd.bind(this),window.addEventListener("resize",this.boundWindowResizeHandler)}removeWindowResizeHandler(){window.removeEventListener("resize",this.boundWindowResizeHandler)}addRootMouseUpHandler(){this.boundRootMouseUpHandler=xl.bind(this),this.root.addEventListener("mouseup",this.boundRootMouseUpHandler)}removeRootMouseUpHandler(){this.root.removeEventListener("mouseup",this.boundRootMouseUpHandler)}addRootMouseLeaveHandler(){this.boundRootMouseLeaveHandler=xl.bind(this),this.root.addEventListener("mouseleave",this.boundRootMouseLeaveHandler)}removeRootMouseLeaveHandler(){this.root.removeEventListener("mouseleave",this.boundRootMouseLeaveHandler)}addColumnContainerEventHandlers(){this.boundColumnContainerMouseMoveHandler=qy.bind(this),this.boundColumnContainerTouchMoveHandler=qy.bind(this),this.boundColumnContainerMouseLeaveHandler=xl.bind(this),this.boundColumnContainerMouseUpHandler=xl.bind(this),this.boundColumnContainerTouchEndHandler=xl.bind(this),this.columnContainer.addEventListener("mousemove",this.boundColumnContainerMouseMoveHandler),this.columnContainer.addEventListener("touchmove",this.boundColumnContainerTouchMoveHandler),this.columnContainer.addEventListener("mouseleave",this.boundColumnContainerMouseLeaveHandler),this.columnContainer.addEventListener("mouseup",this.boundColumnContainerMouseUpHandler),this.columnContainer.addEventListener("touchend",this.boundColumnContainerTouchEndHandler)}removeColumnContainerEventHandlers(){this.columnContainer.removeEventListener("mousemove",this.boundColumnContainerMouseMoveHandler),this.columnContainer.removeEventListener("touchmove",this.boundColumnContainerTouchMoveHandler),this.columnContainer.removeEventListener("mouseleave",this.boundColumnContainerMouseLeaveHandler),this.columnContainer.removeEventListener("mouseup",this.boundColumnContainerMouseUpHandler),this.columnContainer.removeEventListener("touchend",this.boundColumnContainerTouchEndHandler)}addKeyboardHandler(){this.keyUpHandler=eJ.bind(this),document.addEventListener("keyup",this.keyUpHandler)}removeKeyboardHandler(){console.log("Remove handler"),document.addEventListener("keyup",this.keyUpHandler)}static uncompressSession(e){let t;if(e.indexOf("/gzip;base64")>0){t=Ho(e);let r="";for(let n of t)r+=String.fromCharCode(n);return r}else{let r=e.substring(5);return uO(r)}}createCircularView(e,t){return t=t===!0,this.circularView=kG(e,this),this.circularViewControl=new rh(this.navbar.toggleButtonContainer,this),this.circularView.setAssembly({name:this.genome.id,id:this.genome.id,chromosomes:wF(this.genome)}),this.circularViewVisible=t,this.circularView}get circularViewVisible(){return this.circularView!==void 0&&this.circularView.visible}set circularViewVisible(e){this.circularView&&(this.circularView.visible=e,this.circularViewControl.setState(e))}get overlayTrackButton(){return this.navbar.overlayTrackButton}get roiTableControl(){return this.navbar.roiTableControl}get sampleNameControl(){return this.navbar.sampleNameControl}get sampleInfoControl(){return this.navbar.sampleInfoControl}async blat(e){return ma({sequence:e,browser:this,name:"Blat",title:"Blat"})}};Bu=new WeakSet,OA=async function(e){Yt(e)&&(e=JSON.parse(e));let t;try{t=await this.createTrack(e)}catch(r){let n=r.message||r.error||r.toString();const o={401:"Access unauthorized",403:"Access forbidden",404:"Not found"};o.hasOwnProperty(n)&&(n=o[n]),n=`${n} : ${To(e.url)?e.url.name:e.url}`;const s=new Error(n);throw console.error(s),s}if(t)return await this.addTrack(t)};let Lc=Du;function JZ(i){let e;if(i instanceof File)e=i.name;else if(typeof i=="string")e=i;else throw new Error("Input must be a File object or a URL string");return e.split(".").pop().split("?")[0]}async function hd(i){if(this.referenceFrameList===void 0||this.referenceFrameList.length===0)return;const e=this.calculateViewportWidth(this.referenceFrameList.length);this.updateReferenceFrames(e),this.updateViewportElements(e),await this.syncUIState()}function qy(i){i.preventDefault();const{x:e,y:t}=gc(i);if(this.vpMouseDown){const{viewport:r,referenceFrame:n}=this.vpMouseDown,o=Math.abs(e-this.vpMouseDown.mouseDownX)>Math.abs(t-this.vpMouseDown.mouseDownY);if(!this.dragObject&&!this.isScrolling){if(o)this.vpMouseDown.mouseDownX&&Math.abs(e-this.vpMouseDown.mouseDownX)>this.constants.dragThreshold&&(this.dragObject={viewport:r,start:n.start});else if(this.vpMouseDown.mouseDownY&&Math.abs(t-this.vpMouseDown.mouseDownY)>this.constants.scrollThreshold){this.isScrolling=!0;const s=r.viewportElement.clientHeight,a=r.trackView.maxViewportContentHeight();this.vpMouseDown.r=s/a}}if(this.dragObject){const s=!this.isSoftclipped();let a=this.vpMouseDown.lastMouseX-e;n.shiftPixels(a,r.viewportElement.clientWidth,s)&&this.updateViews(),this.fireEvent("trackdrag")}if(this.isScrolling){const s=this.vpMouseDown.lastMouseY-t;r.trackView.scrollByPixels(s)}this.vpMouseDown.lastMouseX=e,this.vpMouseDown.lastMouseY=t}}function xl(i){this.cancelTrackPan(),this.endTrackDrag()}async function eJ(i){if(!(!this.referenceFrameList||this.referenceFrameList.length>1)&&(i.code==="KeyF"||i.code==="KeyB")){const e=this.getSelectedTrackViews();if(e.length>0){const t=e[0].track;if(typeof t.nextFeatureAfter=="function"){const r=this.referenceFrameList[0],n=r.viewport?r.viewport.getWidth():this.calculateViewportWidth(this.referenceFrameList.length),o=r.chr.toLowerCase()==="all",s=t.visibilityWindow;if(o||s&&s>0&&r.bpPerPixel*n>s)return;const a=i.code==="KeyF",c=r.chr,l=r.center,h=await t.nextFeatureAfter(c,l,a);if(h){const d=await this.genome.getChromosomeName(h.chr);if(c===d){const u=(h.start+h.end)/2;if(i.shiftKey){const f=this.config.minimumBases||40,p=Math.max(f,1.1*(h.end-h.start));r.start=Math.max(0,u-p/2),r.end=u+p/2,r.bpPerPixel=(r.end-r.start)/n}else r.shift(u-l);this.updateViews()}else{r.chr=d;const u=(h.start+h.end)/2;if(i.shiftKey){const f=this.config.minimumBases||40,p=Math.max(f,1.1*(h.end-h.start));r.start=Math.max(0,u-p/2),r.end=r.start+p,r.bpPerPixel=(r.end-r.start)/n}else r.start=u-n*r.bpPerPixel/2,r.end=r.start+n*r.bpPerPixel;this.updateViews()}}}}}}function Ag(i,e){for(let{viewports:t}of i)for(let r of t)r.trackLabelElement&&(t.indexOf(r)===0&&e===!0?r.trackLabelElement.style.display="block":r.trackLabelElement.style.display="none")}let Oa=[];async function tJ(i,e){e===void 0&&(e={}),ci.KNOWN_GENOMES||await ci.initializeGenomes(e),HA(e),e.queryParametersSupported&&oJ(e),e.apiKey&&Ee.setApiKey(e.apiKey),e.oauthToken&&Ee.setOauthToken(e.oauthToken),e.clientId&&!Os()&&await vO({client_id:e.clientId,apiKey:e.apiKey,scope:"https://www.googleapis.com/auth/userinfo.profile"});const t=new Lc(e,i);Oa.push(t);const r=e.sessionURL||e.session||e.hubURL;return r?await t.loadSession({url:r}):await t.loadSessionObject(e),t.navbar.navbarDidResize(),t}function iJ(i){i.dispose(),i.root.remove(),Oa=Oa.filter(e=>e!==i)}function rJ(){for(let i of Oa)i.dispose(),i.root.remove();Oa=[]}async function nJ(){for(let i of Oa)await i.visibilityChange()}function HA(i){return i.minimumBases===void 0&&(i.minimumBases=40),i.showIdeogram===void 0&&(i.showIdeogram=!0),i.showCytobandNames==null&&(i.showCytobandNames=!1),i.showCircularView===void 0&&(i.showCircularView=!1),i.showCircularViewButton===void 0&&(i.showCircularViewButton=!1),i.showTrackLabelButton===void 0&&(i.showTrackLabelButton=!0),i.showTrackLabels===void 0&&(i.showTrackLabels=!0),i.showCursorTrackingGuideButton===void 0&&(i.showCursorTrackingGuideButton=!0),i.showCursorGuide===void 0&&(i.showCursorGuide=i.showCursorTrackingGuide||!1),i.showCenterGuideButton===void 0&&(i.showCenterGuideButton=!0),i.showCenterGuide===void 0&&(i.showCenterGuide=!1),i.showSampleNames===void 0&&(i.showSampleNames=!1),i.showSVGButton===void 0&&(i.showSVGButton=!0),i.showControls===void 0&&(i.showControls=!0),i.showNavigation===void 0&&(i.showNavigation=!0),i.showRuler===void 0&&(i.showRuler=!0),i.flanking===void 0&&(i.flanking=1e3),i.pairsSupported===void 0&&(i.pairsSupported=!0),i.tracks||(i.tracks=[]),i}function oJ(i){var e,t,r,n,o,s,a,c,l,h;c=window.location.href,s={},e=c.indexOf("?"),t=c.lastIndexOf("#");let d,u,f;if(e>=0)for(t<0&&(t=c.length),r=e+1;r<t;)n=c.indexOf("&",r),n<0&&(n=t),o=c.substring(r,n),a=o.split("=",2),a.length===2?(l=a[0],h=decodeURIComponent(a[1]),l==="file"?d=h.split(","):l==="index"?u=h.split(","):l==="name"?f=h.split(","):l==="genome"?(h.startsWith("https://")||h.startsWith("http://"))&&!h.endsWith(".json")?i.reference={fastaURL:h,indexURL:h+".fai"}:(i[l]=h,i.reference=void 0):(l==="reference"&&(i.genome=void 0),i[l]=h),r=n+1):r++;if(d){i.tracks||(i.tracks=[]);for(let p=0;p<d.length;p++){if(d[p].endsWith(".xml")||d[p].endsWith(".json")){i.sessionURL=d[p];break}const m={url:d[p]};u&&u.length>p&&(m.indexURL=u[p]),f&&f.length>p&&(m.name=f[p]),i.tracks.push(m)}}return s}async function sJ(i,e){return await Lc.prototype.createTrack.call(e,i)}const aJ=Ee.setApiKey;function lJ(i){return Ee.setOauthToken(i)}function cJ(i,e){return Ee.setOauthToken(i,e)}const hJ=Ee.oauth;var Gy={AlertDialog:n2,TrackUtils:Pj,IGVGraphics:ge,MenuUtils:ix,DataRangeDialog:rx,createTrack:sJ,createBrowser:tJ,removeBrowser:iJ,removeAllBrowsers:rJ,visibilityChange:nJ,setGoogleOauthToken:lJ,setOauthToken:cJ,oauth:hJ,version:IA,setApiKey:aJ,TrackBase:Qt,registerTrackClass:TX,registerTrackCreatorFunction:NX,registerFileFormats:e$,loadSessionFile:Lc.loadSessionFile,loadHub:mu};class dJ extends Error{}class uJ{constructor(e=1e3,t=!1){xe(this,"throttlePeriod");xe(this,"rejectSkipped");xe(this,"queuedPromises",{});xe(this,"pendingPromise",!1);this.throttlePeriod=e,this.rejectSkipped=t}skipPromise(e){if(!this.rejectSkipped)return;const t=this.queuedPromises[e];t==null||t.reject(new dJ)}async enqueue(e,t,r=0){return new Promise((n,o)=>{this.skipPromise(r),this.queuedPromises[r]={action:e,arg:t,resolve:n,reject:o},this.dequeue()})}async dequeue(){const e=Object.keys(this.queuedPromises);if(!this.pendingPromise&&e.length>0){const t=e[0],r=this.queuedPromises[t];delete this.queuedPromises[t],this.pendingPromise=!0;try{const n=await r.action(r.arg);r.resolve(n)}catch(n){r.reject(n)}finally{setTimeout(()=>{this.pendingPromise=!1,this.dequeue()},this.throttlePeriod)}}}}const Wy={bam:{type:"alignment",index:"bam_index"},bcf:{type:"vcf",index:"tabix_index"},bed:{type:"annotation"},bedgraph:{type:"wig"},bigbed:{type:"annotation"},bigwig:{type:"wig"},cram:{type:"alignment",index:"cram_index"},fasta:{type:"sequence",index:"fai_index"},gff:{type:"annotation"},gff3:{type:"annotation"},gtf:{type:"annotation"},twobit:{type:"sequence"},vcf:{type:"vcf"},vcf_bgzip:{type:"vcf",index:"tabix_index"},wig:{type:"wig"}},fJ={key:0,class:"bg-sky-100 border border-sky-200 mt-1 p-2 rounded text-sky-800 text-sm"},pJ={key:1,class:"absolute inset-2 border-4 border-dashed border-sky-600 rounded flex items-center justify-center pointer-events-none bg-sky-200 bg-opacity-80 text-sky-600 text-xl font-semibold z-256"},Qy="hg38",gJ="annotation",mJ=500,bJ="https://s3.amazonaws.com/igv.org.genomes/genomes.json",wJ="http://cdn.jsdelivr.net/gh/galaxyproject/galaxy-test-data/gencode.v29.annotation.gff3",vJ=Me({__name:"Plugin",props:{datasetId:{},root:{},settings:{},specs:{},tracks:{}},emits:["update"],setup(i,{emit:e}){const t={extension:"gff3",id:"__test__",metadata_dbkey:"hg18",name:"TEST DATASET"},r=new uJ(mJ),n=i,o=e,s=ce(!1),a=ce(""),c=ce(null);let l=null,h=[];xi(()=>{d()}),Ri(()=>{u()}),ct(()=>{var T;return(T=n.settings.source)==null?void 0:T.genome},()=>r.enqueue(b,void 0,"loadGenome")),ct(()=>n.settings.locus,()=>r.enqueue(I,void 0,"locusSearch")),ct(()=>n.tracks,()=>r.enqueue(w,void 0,"loadTracks"));async function d(){if(n.settings.source.genome)await b();else if(n.datasetId){const T=await v(n.datasetId);if(T){const N=T.metadata_dbkey||Qy,M=await f(N)||await f(Qy),L=M?{source:M}:{},z=[{urlDataset:{id:T.id}}];o("update",L,z),console.debug("[igv] Updating values.",L,z)}}else a.value="Genome selection required. Open the side panel and choose options."}function u(){l&&(Gy.removeBrowser(l),l=void 0)}async function f(T){const N=["fasta_indexes","twobit"],M=m3();for(const B of N){const O=(await M.getDataTable(B)).find(H=>{var R;return Array.isArray((R=H.value)==null?void 0:R.row)&&H.value.row.includes(T)});if(O)return{genome:O.value,origin:"builtin"}}const U=(await g3().getDataJson(bJ)).find(B=>{var x;return((x=B.value)==null?void 0:x.id)===T});return U?{genome:U.value,origin:"igv"}:null}function p(){const T=n.settings.source.genome;if(T){if(n.settings.source.origin==="igv")return T;{const N=T.id,M=T.columns||[],L=T.row||[],z=T.table,U=M.indexOf("path");if(U>=0&&L.length>U){const B=L[U].split("/").pop(),x=`${n.root}api/tool_data/${z}/fields/${N}/files/`;if(z==="fasta_indexes")return{id:N,fastaURL:`${x}${B}`,indexURL:`${x}${B}.fai`};if(z==="twobit")return{id:N,twoBitURL:`${x}${B}`}}}}}function m(T){return T==="__test__"?wJ:`${n.root}api/datasets/${T}/display`}async function v(T){if(T==="__test__")return t;try{const{data:N}=await Is().GET(`/api/datasets/${T}`);return N}catch(N){return a.value=`Failed to retrieve dataset details for: ${T}`,console.error(a.value,N),null}}function g(T,N){var z;const M=N?(z=Wy[N])==null?void 0:z.index:null;return M&&T!=="__test__"?`${n.root}api/datasets/${T}/metadata_file?metadata_file=${M}`:null}async function b(){const T=p();if(T)try{l?(l.off("locuschange",F),await l.loadGenome(T)):c.value&&(l=await Gy.createBrowser(c.value,{genome:T})),await w(!0),await I(),a.value="",l.on("locuschange",F);const N=l.root.querySelector(".igv-navbar");N&&Object.assign(N.style,{flexFlow:"column",height:"unset",paddingBottom:"3px"})}catch(N){a.value="Failed to load genome.",console.error(a.value,N),u()}}async function w(T=!1){if(l){const N=await _();console.debug("[igv] Resolved Tracks",N);const{toAdd:M,toRemove:L}=S(N,h,T);for(const z of L){const U=l.trackViews.find(B=>B.track.name===z.name);U&&(console.debug(`[igv] Removing existing track '${U.track.name}'`),l.removeTrack(U.track))}for(const z of M)try{console.debug(`[igv] Adding new track '${z.name}'`),await l.loadTrack(z)}catch(U){console.error(`[igv] Failed to load track '${z.name}'`,U)}l.reorderTracks(),h=N.map(z=>({...z}))}}function F(){l&&o("update",{locus:k()})}function k(){var T;if(l&&((T=l.referenceFrameList)==null?void 0:T.length)>0){const N=l.referenceFrameList[0];return`${N.chr}:${Math.round(N.start)+1}-${Math.round(N.end)}`}else{console.error("[igv] Failed to obtain current locus.");return}}async function I(){var T;if(l){const N=(T=n.settings)==null?void 0:T.locus;if(k()!==N){const M=N||"all";if(C(M))try{await l.search(M)}catch{console.warn("[igv] Locus search failed:",M)}else console.warn("[igv] Invalid locus ignored:",M)}}else a.value="Failed to search.",console.error("[igv] Browser not available.")}function C(T){const N=/^[\w.-]+$/,M=/^([\w.-]+):(\d{1,3}(?:,\d{3})*|\d+)-(\d{1,3}(?:,\d{3})*|\d+)$/;if(N.test(T))return!0;{const L=T.match(M);if(L){const z=parseInt(L[2].replace(/,/g,""),10),U=parseInt(L[3].replace(/,/g,""),10);return Number.isInteger(z)&&Number.isInteger(U)&&z<U}else return!1}}function A(T){var z,U,B;let N=!1;const M=[],L=(z=T.dataTransfer)==null?void 0:z.getData("text");try{const x=L?JSON.parse(L):[];if(Array.isArray(x)&&x.length>0){const O=x[0];if(O&&typeof O=="object"){const H=O.id?[O]:Object.values(O);for(const R of H)((U=R.object)==null?void 0:U.model_class)==="HistoryDatasetAssociation"&&((B=R.object)!=null&&B.id)&&R.element_identifier?M.push({id:R.object.id,name:R.element_identifier}):R.history_content_type==="dataset"&&R.id?M.push({id:R.id,name:R.name}):N=!0}else N=!0}else N=!0}catch{a.value="Failed to parse dropped data."}if(N||M.length===0)a.value="Please make sure to only drop valid history datasets.",console.debug("[igv] Dropped Content",L);else{const x=[...n.tracks,...M.map(O=>({urlDataset:O}))];o("update",{},x),a.value="",console.debug("[igv] Dropped Tracks",x)}s.value=!1}function E(T){const N=Object.keys(T).sort(),M=JSON.stringify(T,N);let L=2166136261;for(let z=0;z<M.length;z++)L^=M.charCodeAt(z),L+=(L<<1)+(L<<4)+(L<<7)+(L<<8)+(L<<24);return(L>>>0).toString(36)}function y(T){const N=T==null?void 0:T.toLowerCase();if(N){const M=Wy[N];if(M!=null&&M.type)return M.type}return gJ}function S(T,N,M=!1){const L=new Map(N.map(B=>[B.name,B])),z=N.filter(B=>{const x=T.find(O=>O.name===B.name);return M||!x||E(x)!==E(B)});return{toAdd:T.filter(B=>{const x=L.get(B.name);return M||!x||E(B)!==E(x)}),toRemove:z}}async function _(){const T=[];for(const z of n.tracks){const U=z.urlDataset,B=U?await v(U.id):null,x=z.displayMode,O=z.color,H=(B==null?void 0:B.extension)||null,R=z.indexUrlDataset,D=z.name||(B==null?void 0:B.name)||"",$=z.type&&z.type!=="auto"?z.type:y(H),j=U?m(U.id):null,X=R?m(R.id):g(U==null?void 0:U.id,H),G={color:O,displayMode:x,format:H,indexURL:X,name:D,type:$,url:j};console.debug("[igv] Track:",G),T.push(G)}const N=new Set,M=new Map,L=[];return T.forEach((z,U)=>{const B=z.name||`track-${E(z)}`,x=JSON.stringify({...z,name:B}),O=typeof(z==null?void 0:z.url)=="string"&&z.url.trim().length>0,H=N.has(x);if(O&&!H){const R=M.get(B)??0;let D=B;R>0&&(D=`${B} ~ ${R}`),M.set(B,R+1),N.add(x),L.push({...z,name:D,order:U})}else console.warn(O?`[igv] Duplicate track skipped: '${B}'`:`[igv] Invalid track skipped: '${B}'`)}),L}return(T,N)=>(Pe(),ft("div",{class:"h-screen overflow-auto",onDragover:N[0]||(N[0]=Df(M=>s.value=!0,["prevent"])),onDragleave:N[1]||(N[1]=Df(M=>s.value=!1,["prevent"])),onDrop:Df(A,["prevent"])},[a.value?(Pe(),ft("div",fJ,cn(a.value),1)):nr("",!0),tt("div",{ref_key:"viewport",ref:c},null,512),s.value?(Pe(),ft("div",pJ," Drop Track Datasets! ")):nr("",!0)],32))}}),FJ=Me({__name:"App",props:{container:{},credentials:{},incoming:{}},setup(i){return(e,t)=>(Pe(),Nt($e(bz),{container:e.container,credentials:e.credentials,incoming:e.incoming},{default:pt(({datasetId:r,datasetUrl:n,root:o,save:s,settings:a,specs:c,tracks:l,update:h})=>[Ve(vJ,{"dataset-id":r,"dataset-url":n,root:o,settings:a,specs:c,tracks:l,onSave:s,onUpdate:h},null,8,["dataset-id","dataset-url","root","settings","specs","tracks","onSave","onUpdate"])]),_:1},8,["container","credentials","incoming"]))}});async function yJ(){const e=new URL(import.meta.url).searchParams.get("container")||"app";V9({render:()=>P(FJ,{container:e,credentials:"include"})}).mount(`#${e}`)}yJ();
|
|
2452
|
+
Local files cannot be loaded automatically when a saved session is restored.`),e}compressedSession(){const e=JSON.stringify(this.toJSON());return dO(e)}sessionURL(){const e=window.location.href.slice(),t=e.indexOf("?");return(t>0?e.substring(0,t):e)+"?sessionURL=blob:"+this.compressedSession()}mouseDownOnViewport(e,t){var r;r=gc(e),this.vpMouseDown={viewport:t,lastMouseX:r.x,mouseDownX:r.x,lastMouseY:r.y,mouseDownY:r.y,referenceFrame:t.referenceFrame}}cancelTrackPan(){const e=this.dragObject;this.dragObject=void 0,this.isScrolling=!1,this.vpMouseDown=void 0,e&&e.viewport.referenceFrame.start!==e.start&&(this.updateViews(),this.fireEvent("trackdragend",[e.viewport]))}isTrackPanning(){return this.dragObject}isSoftclipped(){return this.trackViews.find(t=>t.track.showSoftClips===!0)!==void 0}startTrackDrag(e){this.dragTrack=e}updateTrackDrag(e){if(e&&this.dragTrack){const t=this.dragTrack,r=this.trackViews.indexOf(e),n=this.trackViews.indexOf(t),o=this.trackViews;o[r]=t,o[n]=e;const s=this.trackViews[r].track.order;this.trackViews[n].track.order=s;const a=o.length;let c=s;if(r<n)for(let l=r+1;l<a;l++){const h=o[l].track;if(h.order<=c)h.order=Math.min(Number.MAX_SAFE_INTEGER,c+1),c=h.order;else break}else for(let l=r-1;l>0;l--){const h=o[l].track;if(h.order>=c)h.order=Math.max(-Number.MAX_SAFE_INTEGER,c-1),c=h.order;else break}this.reorderTracks()}}endTrackDrag(){this.dragTrack?(this.dragTrack=void 0,this.fireEvent("trackorderchanged",[this.getTrackOrder()])):this.dragTrack=void 0}addEventHandlers(){this.addWindowResizeHandler(),this.addRootMouseUpHandler(),this.addRootMouseLeaveHandler(),this.addColumnContainerEventHandlers(),this.addKeyboardHandler()}removeEventHandlers(){this.removeWindowResizeHandler(),this.removeRootMouseUpHandler(),this.removeRootMouseLeaveHandler(),this.removeColumnContainerEventHandlers(),this.removeKeyboardHandler()}addWindowResizeHandler(){this.boundWindowResizeHandler=hd.bind(this),window.addEventListener("resize",this.boundWindowResizeHandler)}removeWindowResizeHandler(){window.removeEventListener("resize",this.boundWindowResizeHandler)}addRootMouseUpHandler(){this.boundRootMouseUpHandler=xl.bind(this),this.root.addEventListener("mouseup",this.boundRootMouseUpHandler)}removeRootMouseUpHandler(){this.root.removeEventListener("mouseup",this.boundRootMouseUpHandler)}addRootMouseLeaveHandler(){this.boundRootMouseLeaveHandler=xl.bind(this),this.root.addEventListener("mouseleave",this.boundRootMouseLeaveHandler)}removeRootMouseLeaveHandler(){this.root.removeEventListener("mouseleave",this.boundRootMouseLeaveHandler)}addColumnContainerEventHandlers(){this.boundColumnContainerMouseMoveHandler=qy.bind(this),this.boundColumnContainerTouchMoveHandler=qy.bind(this),this.boundColumnContainerMouseLeaveHandler=xl.bind(this),this.boundColumnContainerMouseUpHandler=xl.bind(this),this.boundColumnContainerTouchEndHandler=xl.bind(this),this.columnContainer.addEventListener("mousemove",this.boundColumnContainerMouseMoveHandler),this.columnContainer.addEventListener("touchmove",this.boundColumnContainerTouchMoveHandler),this.columnContainer.addEventListener("mouseleave",this.boundColumnContainerMouseLeaveHandler),this.columnContainer.addEventListener("mouseup",this.boundColumnContainerMouseUpHandler),this.columnContainer.addEventListener("touchend",this.boundColumnContainerTouchEndHandler)}removeColumnContainerEventHandlers(){this.columnContainer.removeEventListener("mousemove",this.boundColumnContainerMouseMoveHandler),this.columnContainer.removeEventListener("touchmove",this.boundColumnContainerTouchMoveHandler),this.columnContainer.removeEventListener("mouseleave",this.boundColumnContainerMouseLeaveHandler),this.columnContainer.removeEventListener("mouseup",this.boundColumnContainerMouseUpHandler),this.columnContainer.removeEventListener("touchend",this.boundColumnContainerTouchEndHandler)}addKeyboardHandler(){this.keyUpHandler=eJ.bind(this),document.addEventListener("keyup",this.keyUpHandler)}removeKeyboardHandler(){console.log("Remove handler"),document.addEventListener("keyup",this.keyUpHandler)}static uncompressSession(e){let t;if(e.indexOf("/gzip;base64")>0){t=Ho(e);let r="";for(let n of t)r+=String.fromCharCode(n);return r}else{let r=e.substring(5);return uO(r)}}createCircularView(e,t){return t=t===!0,this.circularView=kG(e,this),this.circularViewControl=new rh(this.navbar.toggleButtonContainer,this),this.circularView.setAssembly({name:this.genome.id,id:this.genome.id,chromosomes:wF(this.genome)}),this.circularViewVisible=t,this.circularView}get circularViewVisible(){return this.circularView!==void 0&&this.circularView.visible}set circularViewVisible(e){this.circularView&&(this.circularView.visible=e,this.circularViewControl.setState(e))}get overlayTrackButton(){return this.navbar.overlayTrackButton}get roiTableControl(){return this.navbar.roiTableControl}get sampleNameControl(){return this.navbar.sampleNameControl}get sampleInfoControl(){return this.navbar.sampleInfoControl}async blat(e){return ma({sequence:e,browser:this,name:"Blat",title:"Blat"})}};Bu=new WeakSet,OA=async function(e){Yt(e)&&(e=JSON.parse(e));let t;try{t=await this.createTrack(e)}catch(r){let n=r.message||r.error||r.toString();const o={401:"Access unauthorized",403:"Access forbidden",404:"Not found"};o.hasOwnProperty(n)&&(n=o[n]),n=`${n} : ${To(e.url)?e.url.name:e.url}`;const s=new Error(n);throw console.error(s),s}if(t)return await this.addTrack(t)};let Lc=Du;function JZ(i){let e;if(i instanceof File)e=i.name;else if(typeof i=="string")e=i;else throw new Error("Input must be a File object or a URL string");return e.split(".").pop().split("?")[0]}async function hd(i){if(this.referenceFrameList===void 0||this.referenceFrameList.length===0)return;const e=this.calculateViewportWidth(this.referenceFrameList.length);this.updateReferenceFrames(e),this.updateViewportElements(e),await this.syncUIState()}function qy(i){i.preventDefault();const{x:e,y:t}=gc(i);if(this.vpMouseDown){const{viewport:r,referenceFrame:n}=this.vpMouseDown,o=Math.abs(e-this.vpMouseDown.mouseDownX)>Math.abs(t-this.vpMouseDown.mouseDownY);if(!this.dragObject&&!this.isScrolling){if(o)this.vpMouseDown.mouseDownX&&Math.abs(e-this.vpMouseDown.mouseDownX)>this.constants.dragThreshold&&(this.dragObject={viewport:r,start:n.start});else if(this.vpMouseDown.mouseDownY&&Math.abs(t-this.vpMouseDown.mouseDownY)>this.constants.scrollThreshold){this.isScrolling=!0;const s=r.viewportElement.clientHeight,a=r.trackView.maxViewportContentHeight();this.vpMouseDown.r=s/a}}if(this.dragObject){const s=!this.isSoftclipped();let a=this.vpMouseDown.lastMouseX-e;n.shiftPixels(a,r.viewportElement.clientWidth,s)&&this.updateViews(),this.fireEvent("trackdrag")}if(this.isScrolling){const s=this.vpMouseDown.lastMouseY-t;r.trackView.scrollByPixels(s)}this.vpMouseDown.lastMouseX=e,this.vpMouseDown.lastMouseY=t}}function xl(i){this.cancelTrackPan(),this.endTrackDrag()}async function eJ(i){if(!(!this.referenceFrameList||this.referenceFrameList.length>1)&&(i.code==="KeyF"||i.code==="KeyB")){const e=this.getSelectedTrackViews();if(e.length>0){const t=e[0].track;if(typeof t.nextFeatureAfter=="function"){const r=this.referenceFrameList[0],n=r.viewport?r.viewport.getWidth():this.calculateViewportWidth(this.referenceFrameList.length),o=r.chr.toLowerCase()==="all",s=t.visibilityWindow;if(o||s&&s>0&&r.bpPerPixel*n>s)return;const a=i.code==="KeyF",c=r.chr,l=r.center,h=await t.nextFeatureAfter(c,l,a);if(h){const d=await this.genome.getChromosomeName(h.chr);if(c===d){const u=(h.start+h.end)/2;if(i.shiftKey){const f=this.config.minimumBases||40,p=Math.max(f,1.1*(h.end-h.start));r.start=Math.max(0,u-p/2),r.end=u+p/2,r.bpPerPixel=(r.end-r.start)/n}else r.shift(u-l);this.updateViews()}else{r.chr=d;const u=(h.start+h.end)/2;if(i.shiftKey){const f=this.config.minimumBases||40,p=Math.max(f,1.1*(h.end-h.start));r.start=Math.max(0,u-p/2),r.end=r.start+p,r.bpPerPixel=(r.end-r.start)/n}else r.start=u-n*r.bpPerPixel/2,r.end=r.start+n*r.bpPerPixel;this.updateViews()}}}}}}function Ag(i,e){for(let{viewports:t}of i)for(let r of t)r.trackLabelElement&&(t.indexOf(r)===0&&e===!0?r.trackLabelElement.style.display="block":r.trackLabelElement.style.display="none")}let Oa=[];async function tJ(i,e){e===void 0&&(e={}),ci.KNOWN_GENOMES||await ci.initializeGenomes(e),HA(e),e.queryParametersSupported&&oJ(e),e.apiKey&&Ee.setApiKey(e.apiKey),e.oauthToken&&Ee.setOauthToken(e.oauthToken),e.clientId&&!Os()&&await vO({client_id:e.clientId,apiKey:e.apiKey,scope:"https://www.googleapis.com/auth/userinfo.profile"});const t=new Lc(e,i);Oa.push(t);const r=e.sessionURL||e.session||e.hubURL;return r?await t.loadSession({url:r}):await t.loadSessionObject(e),t.navbar.navbarDidResize(),t}function iJ(i){i.dispose(),i.root.remove(),Oa=Oa.filter(e=>e!==i)}function rJ(){for(let i of Oa)i.dispose(),i.root.remove();Oa=[]}async function nJ(){for(let i of Oa)await i.visibilityChange()}function HA(i){return i.minimumBases===void 0&&(i.minimumBases=40),i.showIdeogram===void 0&&(i.showIdeogram=!0),i.showCytobandNames==null&&(i.showCytobandNames=!1),i.showCircularView===void 0&&(i.showCircularView=!1),i.showCircularViewButton===void 0&&(i.showCircularViewButton=!1),i.showTrackLabelButton===void 0&&(i.showTrackLabelButton=!0),i.showTrackLabels===void 0&&(i.showTrackLabels=!0),i.showCursorTrackingGuideButton===void 0&&(i.showCursorTrackingGuideButton=!0),i.showCursorGuide===void 0&&(i.showCursorGuide=i.showCursorTrackingGuide||!1),i.showCenterGuideButton===void 0&&(i.showCenterGuideButton=!0),i.showCenterGuide===void 0&&(i.showCenterGuide=!1),i.showSampleNames===void 0&&(i.showSampleNames=!1),i.showSVGButton===void 0&&(i.showSVGButton=!0),i.showControls===void 0&&(i.showControls=!0),i.showNavigation===void 0&&(i.showNavigation=!0),i.showRuler===void 0&&(i.showRuler=!0),i.flanking===void 0&&(i.flanking=1e3),i.pairsSupported===void 0&&(i.pairsSupported=!0),i.tracks||(i.tracks=[]),i}function oJ(i){var e,t,r,n,o,s,a,c,l,h;c=window.location.href,s={},e=c.indexOf("?"),t=c.lastIndexOf("#");let d,u,f;if(e>=0)for(t<0&&(t=c.length),r=e+1;r<t;)n=c.indexOf("&",r),n<0&&(n=t),o=c.substring(r,n),a=o.split("=",2),a.length===2?(l=a[0],h=decodeURIComponent(a[1]),l==="file"?d=h.split(","):l==="index"?u=h.split(","):l==="name"?f=h.split(","):l==="genome"?(h.startsWith("https://")||h.startsWith("http://"))&&!h.endsWith(".json")?i.reference={fastaURL:h,indexURL:h+".fai"}:(i[l]=h,i.reference=void 0):(l==="reference"&&(i.genome=void 0),i[l]=h),r=n+1):r++;if(d){i.tracks||(i.tracks=[]);for(let p=0;p<d.length;p++){if(d[p].endsWith(".xml")||d[p].endsWith(".json")){i.sessionURL=d[p];break}const m={url:d[p]};u&&u.length>p&&(m.indexURL=u[p]),f&&f.length>p&&(m.name=f[p]),i.tracks.push(m)}}return s}async function sJ(i,e){return await Lc.prototype.createTrack.call(e,i)}const aJ=Ee.setApiKey;function lJ(i){return Ee.setOauthToken(i)}function cJ(i,e){return Ee.setOauthToken(i,e)}const hJ=Ee.oauth;var Gy={AlertDialog:n2,TrackUtils:Pj,IGVGraphics:ge,MenuUtils:ix,DataRangeDialog:rx,createTrack:sJ,createBrowser:tJ,removeBrowser:iJ,removeAllBrowsers:rJ,visibilityChange:nJ,setGoogleOauthToken:lJ,setOauthToken:cJ,oauth:hJ,version:IA,setApiKey:aJ,TrackBase:Qt,registerTrackClass:TX,registerTrackCreatorFunction:NX,registerFileFormats:e$,loadSessionFile:Lc.loadSessionFile,loadHub:mu};class dJ extends Error{}class uJ{constructor(e=1e3,t=!1){xe(this,"throttlePeriod");xe(this,"rejectSkipped");xe(this,"queuedPromises",{});xe(this,"pendingPromise",!1);this.throttlePeriod=e,this.rejectSkipped=t}skipPromise(e){if(!this.rejectSkipped)return;const t=this.queuedPromises[e];t==null||t.reject(new dJ)}async enqueue(e,t,r=0){return new Promise((n,o)=>{this.skipPromise(r),this.queuedPromises[r]={action:e,arg:t,resolve:n,reject:o},this.dequeue()})}async dequeue(){const e=Object.keys(this.queuedPromises);if(!this.pendingPromise&&e.length>0){const t=e[0],r=this.queuedPromises[t];delete this.queuedPromises[t],this.pendingPromise=!0;try{const n=await r.action(r.arg);r.resolve(n)}catch(n){r.reject(n)}finally{setTimeout(()=>{this.pendingPromise=!1,this.dequeue()},this.throttlePeriod)}}}}const Wy={bam:{type:"alignment",index:"bam_index"},bcf:{type:"vcf",index:"tabix_index"},bed:{type:"annotation"},bedgraph:{type:"wig"},bigbed:{type:"annotation"},bigwig:{type:"wig"},cram:{type:"alignment",index:"cram_index"},fasta:{type:"sequence",index:"fai_index"},gff:{type:"annotation"},gff3:{type:"annotation"},gtf:{type:"annotation"},twobit:{type:"sequence"},vcf:{type:"vcf"},vcf_bgzip:{type:"vcf",index:"tabix_index"},wig:{type:"wig"}},fJ={key:0,class:"bg-sky-100 border border-sky-200 mt-1 p-2 rounded text-sky-800 text-sm"},pJ={key:1,class:"absolute inset-2 border-4 border-dashed border-sky-600 rounded flex items-center justify-center pointer-events-none bg-sky-200 bg-opacity-80 text-sky-600 text-xl font-semibold z-256"},Qy="hg38",gJ="annotation",mJ=500,bJ="https://s3.amazonaws.com/igv.org.genomes/genomes.json",wJ="http://cdn.jsdelivr.net/gh/galaxyproject/galaxy-test-data/gencode.v29.annotation.gff3",vJ=Me({__name:"Plugin",props:{datasetId:{},root:{},settings:{},specs:{},tracks:{}},emits:["update"],setup(i,{emit:e}){const t={extension:"gff3",id:"__test__",metadata_dbkey:"hg18",name:"TEST DATASET"},r=new uJ(mJ),n=i,o=e,s=ce(!1),a=ce(""),c=ce(null);let l=null,h=[];xi(()=>{d()}),Ri(()=>{u()}),ct(()=>{var T;return(T=n.settings.source)==null?void 0:T.genome},()=>r.enqueue(b,void 0,"loadGenome")),ct(()=>n.settings.locus,()=>r.enqueue(I,void 0,"locusSearch")),ct(()=>n.tracks,()=>r.enqueue(w,void 0,"loadTracks"));async function d(){if(n.settings.source.genome)await b();else if(n.datasetId){const T=await v(n.datasetId);if(T){const N=T.metadata_dbkey||Qy,M=await f(N)||await f(Qy),L=M?{source:M}:{},z=[{urlDataset:{id:T.id}}];o("update",L,z),console.debug("[igv] Updating values.",L,z)}}else a.value="Genome selection required. Open the side panel and choose options."}function u(){l&&(Gy.removeBrowser(l),l=void 0)}async function f(T){const N=["fasta_indexes","twobit"],M=m3();for(const B of N){const O=(await M.getDataTable(B)).find(H=>{var R;return Array.isArray((R=H.value)==null?void 0:R.row)&&H.value.row.includes(T)});if(O)return{genome:O.value,origin:"builtin"}}const U=(await g3().getDataJson(bJ)).find(B=>{var x;return((x=B.value)==null?void 0:x.id)===T});return U?{genome:U.value,origin:"igv"}:null}function p(){const T=n.settings.source.genome;if(T){if(n.settings.source.origin==="igv")return T;{const N=T.id,M=T.columns||[],L=T.row||[],z=T.table,U=M.indexOf("path");if(U>=0&&L.length>U){const B=L[U].split("/").pop(),x=`${n.root}api/tool_data/${z}/fields/${N}/files/`;if(z==="fasta_indexes")return{id:N,fastaURL:`${x}${B}`,indexURL:`${x}${B}.fai`};if(z==="twobit")return{id:N,twoBitURL:`${x}${B}`}}}}}function m(T){return T==="__test__"?wJ:`${n.root}api/datasets/${T}/display`}async function v(T){if(T==="__test__")return t;try{const{data:N}=await Is().GET(`/api/datasets/${T}`);return N}catch(N){return a.value=`Failed to retrieve dataset details for: ${T}`,console.error(a.value,N),null}}function g(T,N){var z;const M=N?(z=Wy[N])==null?void 0:z.index:null;return M&&T!=="__test__"?`${n.root}api/datasets/${T}/metadata_file?metadata_file=${M}`:null}async function b(){const T=p();if(T)try{l?(l.off("locuschange",F),await l.loadGenome(T)):c.value&&(l=await Gy.createBrowser(c.value,{genome:T})),await w(!0),await I(),a.value="",l.on("locuschange",F);const N=l.root.querySelector(".igv-navbar");N&&Object.assign(N.style,{flexFlow:"column",height:"unset",paddingBottom:"3px"})}catch(N){a.value="Failed to load genome.",console.error(a.value,N),u()}}async function w(T=!1){if(l){const N=await _();console.debug("[igv] Resolved Tracks",N);const{toAdd:M,toRemove:L}=S(N,h,T);for(const z of L){const U=l.trackViews.find(B=>B.track.name===z.name);U&&(console.debug(`[igv] Removing existing track '${U.track.name}'`),l.removeTrack(U.track))}for(const z of M)try{console.debug(`[igv] Adding new track '${z.name}'`),await l.loadTrack(z)}catch(U){console.error(`[igv] Failed to load track '${z.name}'`,U)}l.reorderTracks(),h=N.map(z=>({...z}))}}function F(){l&&o("update",{locus:k()})}function k(){var T;if(l&&((T=l.referenceFrameList)==null?void 0:T.length)>0){const N=l.referenceFrameList[0];return`${N.chr}:${Math.round(N.start)+1}-${Math.round(N.end)}`}else{console.error("[igv] Failed to obtain current locus.");return}}async function I(){var T;if(l){const N=(T=n.settings)==null?void 0:T.locus;if(k()!==N){const M=N||"all";if(C(M))try{await l.search(M)}catch{console.warn("[igv] Locus search failed:",M)}else console.warn("[igv] Invalid locus ignored:",M)}}else a.value="Failed to search.",console.error("[igv] Browser not available.")}function C(T){const N=/^[\w.-]+$/,M=/^([\w.-]+):(\d{1,3}(?:,\d{3})*|\d+)-(\d{1,3}(?:,\d{3})*|\d+)$/;if(N.test(T))return!0;{const L=T.match(M);if(L){const z=parseInt(L[2].replace(/,/g,""),10),U=parseInt(L[3].replace(/,/g,""),10);return Number.isInteger(z)&&Number.isInteger(U)&&z<U}else return!1}}function A(T){var z,U,B;let N=!1;const M=[],L=(z=T.dataTransfer)==null?void 0:z.getData("text");try{const x=L?JSON.parse(L):[];if(Array.isArray(x)&&x.length>0){const O=x[0];if(O&&typeof O=="object"){const H=O.id?[O]:Object.values(O);for(const R of H)((U=R.object)==null?void 0:U.model_class)==="HistoryDatasetAssociation"&&((B=R.object)!=null&&B.id)&&R.element_identifier?M.push({id:R.object.id,name:R.element_identifier}):R.history_content_type==="dataset"&&R.id?M.push({id:R.id,name:R.name}):N=!0}else N=!0}else N=!0}catch{a.value="Failed to parse dropped data."}if(N||M.length===0)a.value="Please make sure to only drop valid history datasets.",console.debug("[igv] Dropped Content",L);else{const x=[...n.tracks,...M.map(O=>({urlDataset:O}))];o("update",{},x),a.value="",console.debug("[igv] Dropped Tracks",x)}s.value=!1}function E(T){const N=Object.keys(T).sort(),M=JSON.stringify(T,N);let L=2166136261;for(let z=0;z<M.length;z++)L^=M.charCodeAt(z),L+=(L<<1)+(L<<4)+(L<<7)+(L<<8)+(L<<24);return(L>>>0).toString(36)}function y(T){const N=T==null?void 0:T.toLowerCase();if(N){const M=Wy[N];if(M!=null&&M.type)return M.type}return gJ}function S(T,N,M=!1){const L=new Map(N.map(B=>[B.name,B])),z=N.filter(B=>{const x=T.find(O=>O.name===B.name);return M||!x||E(x)!==E(B)});return{toAdd:T.filter(B=>{const x=L.get(B.name);return M||!x||E(B)!==E(x)}),toRemove:z}}async function _(){const T=[];for(const z of n.tracks){const U=z.urlDataset,B=U?await v(U.id):null,x=z.displayMode,O=z.color,H=(B==null?void 0:B.extension)||null,R=z.indexUrlDataset,D=z.name||(B==null?void 0:B.name)||"",$=z.type&&z.type!=="auto"?z.type:y(H),j=U?m(U.id):null,X=R?m(R.id):g(U==null?void 0:U.id,H),G={color:O,displayMode:x,format:H,indexURL:X,name:D,type:$,url:j};console.debug("[igv] Track:",G),T.push(G)}const N=new Set,M=new Map,L=[];return T.forEach((z,U)=>{const B=z.name||`track-${E(z)}`,x=JSON.stringify({...z,name:B}),O=typeof(z==null?void 0:z.url)=="string"&&z.url.trim().length>0,H=N.has(x);if(O&&!H){const R=M.get(B)??0;let D=B;R>0&&(D=`${B} ~ ${R}`),M.set(B,R+1),N.add(x),L.push({...z,name:D,order:-U})}else console.warn(O?`[igv] Duplicate track skipped: '${B}'`:`[igv] Invalid track skipped: '${B}'`)}),L}return(T,N)=>(Pe(),ft("div",{class:"h-screen overflow-auto",onDragover:N[0]||(N[0]=Df(M=>s.value=!0,["prevent"])),onDragleave:N[1]||(N[1]=Df(M=>s.value=!1,["prevent"])),onDrop:Df(A,["prevent"])},[a.value?(Pe(),ft("div",fJ,cn(a.value),1)):nr("",!0),tt("div",{ref_key:"viewport",ref:c},null,512),s.value?(Pe(),ft("div",pJ," Drop Track Datasets! ")):nr("",!0)],32))}}),FJ=Me({__name:"App",props:{container:{},credentials:{},incoming:{}},setup(i){return(e,t)=>(Pe(),Nt($e(bz),{container:e.container,credentials:e.credentials,incoming:e.incoming},{default:pt(({datasetId:r,datasetUrl:n,root:o,save:s,settings:a,specs:c,tracks:l,update:h})=>[Ve(vJ,{"dataset-id":r,"dataset-url":n,root:o,settings:a,specs:c,tracks:l,onSave:s,onUpdate:h},null,8,["dataset-id","dataset-url","root","settings","specs","tracks","onSave","onUpdate"])]),_:1},8,["container","credentials","incoming"]))}});async function yJ(){const e=new URL(import.meta.url).searchParams.get("container")||"app";V9({render:()=>P(FJ,{container:e,credentials:"include"})}).mount(`#${e}`)}yJ();
|