@gmod/jbrowse
Version:
JBrowse - client-side genome browser
201 lines (181 loc) • 8.46 kB
JavaScript
define( ['dojo/_base/declare',
'dojo/_base/array',
'dojo/dom-construct',
'dijit/form/Select'
],
function( declare, array, dom, Select ) {
return declare( null, {
constructor: function( args ) {
this.dialog = args.dialog;
this.domNode = dom.create( 'div', { className: 'resourceList' } );
this._updateView();
},
clearLocalFiles: function() {
this._resources = array.filter( this._resources || [], function(res) {
return ! res.file;
});
this._notifyChange();
},
_notifyChange: function() {
this.onChange( array.map( this._resources || [], function( res ) {
var r = {};
if( res.file )
r.file = res.file;
if( res.url )
r.url = res.url;
r.type = res.type.get('value');
return r;
}));
},
_addResources: function( resources ) {
var seenFile = {};
var allRes = ( this._resources||[] ).concat( resources );
this._resources = array.filter( allRes.reverse(), function( res ) {
var key = res.file && res.file.name || res.url;
if( seenFile[key] ) {
return false;
}
seenFile[key] = true;
return true;
}).reverse();
this._updateView();
this._notifyChange();
},
addLocalFiles: function( fileList ) {
this._addResources( array.map( fileList, function(file) {
return { file: file };
}));
},
clearURLs: function() {
this._resources = array.filter( this._resources || [], function(res) {
return ! res.url;
});
this._notifyChange();
},
addURLs: function( urls ) {
this._addResources( array.map( urls, function(u) {
return { url: u };
}));
},
// old-style handler stub
onChange: function() { },
_updateView: function() {
var container = this.domNode;
dom.empty( container );
dom.create('h3', { innerHTML: 'Files and URLs' }, container );
if( (this._resources||[]).length ) {
var table = dom.create('table',{}, container );
// render rows in the resource table for each resource in our
// list
array.forEach( this._resources, function( res, i){
var that = this;
var tr = dom.create('tr', {}, table );
var name = res.url || res.file.name;
// make a selector for the resource's type
var typeSelect = new Select({
options: [
{ label: '<span class="ghosted">file type?</span>', value: null },
{ label: "GFF3", value: "gff3" },
{ label: "GTF", value: "gtf" },
{ label: "BigWig", value: "bigwig" },
{ label: "BAM", value: "bam" },
{ label: "BAM index", value: "bam.bai"},
{ label: "FASTA", value: "fasta" },
{ label: "FASTA index", value: "fai" },
{ label: "BGZIP FASTA", value: "fasta.gz" },
{ label: "BGZIP FASTA index (.gz.fai)", value: "fasta.gz.fai" },
{ label: "BGZIP index (.gz.gzi)", value: "gzi" },
{ label: "2bit", value: "2bit" },
{ label: "BigBed", value: "bb" },
{ label: "VCF+bgzip", value: "vcf.gz" },
{ label: "VCF", value: "vcf" },
{ label: "IGV/GATK Index", value: "idx" },
{ label: "BED+bgzip", value: "bed.gz" },
{ label: "BED", value: "bed" },
{ label: "GFF3+bgzip", value: "gff3.gz"},
{ label: "VCF+Tabix index", value: "vcf.gz.tbi" },
{ label: "GFF3+Tabix index", value: "gff3.gz.tbi" },
{ label: "BED+Tabix index", value: "bed.gz.tbi" },
{ label: "BED+CSI index", value: "bed.gz.csi" },
{ label: "VCF+CSI index", value: "vcf.gz.csi" },
{ label: "GFF3+CSI index", value: "gff3.gz.csi" },
{ label: "BAM+CSI index", value: "bam.csi" },
{ label: "CRAM", value: "cram" },
{ label: "CRAM index", value: "cram.crai"},
{ label: "Chrom sizes", value: "chrom.sizes"},
],
value: this.guessType( name ),
onChange: function() {
that._rememberedTypes = that._rememberedTypes||{};
that._rememberedTypes[name] = this.get('value');
that._notifyChange();
}
});
typeSelect.placeAt( dojo.create('td',{ width: '4%'},tr) );
res.type = typeSelect;
dojo.create( 'td', {
width: '1%',
innerHTML: '<div class="'+(res.file ? 'dijitIconFile' : 'jbrowseIconLink')+'"></div>'
},tr);
dojo.create('td',{ innerHTML: name },tr);
dojo.create('td',{
width: '1%',
innerHTML: '<div class="dijitIconDelete"></div>',
onclick: function(e) {
e.preventDefault && e.preventDefault();
that.deleteResource( res );
}
}, tr);
}, this);
}
else {
dom.create('div', { className: 'emptyMessage',
innerHTML: 'Add files and URLs using the controls above.'
},
container);
}
// little elements used to show pipeline-like connections between the controls
dom.create( 'div', { className: 'connector', innerHTML: ' '}, container );
},
deleteResource: function( resource ) {
this._resources = array.filter( this._resources || [], function(res) {
return res !== resource;
});
this._updateView();
this._notifyChange();
},
guessType: function( name ) {
return ( this._rememberedTypes||{} )[name] || (
/\.bam$/i.test( name ) ? 'bam' :
/\.bai$/i.test( name ) ? 'bam.bai' :
/\.gff3?$/i.test( name ) ? 'gff3' :
/\.gtf?$/i.test( name ) ? 'gtf' :
/\.(bw|bigwig)$/i.test( name ) ? 'bigwig' :
/\.(fa|fasta|fna|mfa)$/i.test( name ) ? 'fasta' :
/\.(fa|fasta|fna|mfa)\.gz$/i.test( name ) ? 'fasta.gz':
/\.(fa|fasta|fna|mfa)\.gz\.fai$/i.test( name ) ? 'fasta.gz.fai':
/\.2bit$/i.test( name ) ? '2bit' :
/\.fai$/i.test( name ) ? 'fai' :
/\.idx$/i.test( name ) ? 'idx' :
/\.vcf$/i.test( name ) ? 'vcf' :
/\.vcf\.gz$/i.test( name ) ? 'vcf.gz' :
/\.bed\.gz$/i.test( name ) ? 'bed.gz' :
/\.gzi$/i.test( name ) ? 'gzi' :
/\.gff3?\.gz$/i.test( name ) ? 'gff3.gz':
/\.bed$/i.test( name ) ? 'bed' :
/\.(bb|bigbed)$/i.test( name ) ? 'bb' :
/\.gff3?\.gz.tbi$/i.test( name )? 'gff3.gz.tbi' :
/\.vcf.gz.tbi$/i.test( name ) ? 'vcf.gz.tbi' :
/\.bed.gz.tbi$/i.test( name ) ? 'bed.gz.tbi' :
/\.bed.gz.csi/i.test( name ) ? 'bed.gz.csi' :
/\.gff3?\.gz.csi$/i.test( name )? 'gff3.gz.csi' :
/\.vcf.gz.csi$/i.test( name ) ? 'vcf.gz.csi' :
/\.bam.csi$/i.test( name ) ? 'bam.csi' :
/\.cram$/i.test( name ) ? 'cram' :
/\.crai$/i.test( name ) ? 'cram.crai' :
/\.sizes$/i.test( name ) ? 'chrom.sizes' :
null
);
}
});
});