escher-vis
Version:
Escher: A Web Application for Building, Sharing, and Embedding Data-Rich Visualizations of Biological Pathways
94 lines (81 loc) • 2.89 kB
JavaScript
/** DataMenu */
var utils = require('./utils');
var d3_json = require('d3-request').json
module.exports = function(options) {
var o = utils.set_options(options, {
selection: null,
getdatafiles: null,
datafiles: null,
update_callback: null,
target: null});
if (o.selection===null)
throw new Error('No selection provided for DataMenu');
// setup dropdown menu
// Append menu if it doesn't exist
var menu = o.selection.select('.data-menu');
if (menu.empty()) {
menu = o.selection.append('div')
.attr('class','data-menu');
}
var select_sel = menu.append('form')
.append('select').attr('class','dropdown-menu');
if (o.getdatafiles) {
if (o.datafiles) {
console.warn('DataMenu: getdatafiles option overrides datafiles');
}
d3_json(o.getdatafiles, function(error, d) {
// returns json object: { data: [file0, file1, ...] }
if (error) {
return console.warn(error);
} else {
load_with_files(o.target, d.data, select_sel, o.update_callback, o.selection);
}
return null;
});
} else if (o.datafiles) {
load_with_files(o.target, o.datafiles, select_sel, o.update_callback, o.selection);
} else {
console.warn('DataMenu: No datafiles given');
}
return { update: update };
// definitions
function load_with_files(t, files, select_sel, update_callback, selection) {
//when it changes
select_sel.node().addEventListener("change", function() {
load_datafile(t, this.value, selection, update_callback);
}, false);
var file = files[0];
update(files, select_sel);
load_datafile(t, file, selection, update_callback);
};
function load_datafile(t, this_file, selection, callback) {
utils.load_the_file(t, this_file, function(error, data) {
if (error) {
return console.warn(error);
selection.append('error loading');
o.data = null;
} else {
o.data = data;
if (callback) {
callback(data);
}
}
});
};
function update(list, select_sel) {
// update select element with d3 selection /select_sel/ to have options
// given by /list/
// TODO remove paths from file list
select_sel.selectAll(".menu-option")
.data(list)
.enter()
.append('option')
.attr('value', function (d) { return d; } )
.text(function (d) { return d; } );
// TODO set value to default_filename_index
select_sel.node().focus();
};
function get_data() {
return o.data;
};
};