UNPKG

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
/** 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; }; };