escher-vis
Version:
Escher: A Web Application for Building, Sharing, and Embedding Data-Rich Visualizations of Biological Pathways
165 lines (150 loc) • 5.81 kB
JavaScript
/** ui */
var utils = require('./utils');
var data_styles = require('./data_styles');
module.exports = {
individual_button: individual_button,
radio_button_group: radio_button_group,
button_group: button_group,
dropdown_menu: dropdown_menu,
set_json_input_button: set_json_input_button,
set_json_or_csv_input_button: set_json_or_csv_input_button
};
function _button_with_sel (b, button) {
var ignore_bootstrap = button.ignore_bootstrap || false
b.attr('class', 'btn btn-default simple-button')
// icon
var c = b.append('span')
// text / bootstrap fallback
var t = c.append('span')
if ('id' in button) b.attr('id', button.id)
if ('text' in button) t.text(button.text)
if ('icon' in button && !ignore_bootstrap) c.classed(button.icon, true)
if (!ignore_bootstrap) t.attr('class', 'hidden')
if ('key' in button) set_button(b, button.key)
// tooltip
if ('key_text' in button && 'tooltip' in button && button.key_text !== null)
b.attr('title', button.tooltip + button.key_text)
else if ('tooltip' in button)
b.attr('title', button.tooltip)
}
function individual_button(s, button) {
var b = s.append('button')
_button_with_sel(b, button)
}
function radio_button_group(s) {
var s2 = s.append('li')
.attr('class', 'btn-group-vertical')
.attr('data-toggle', 'buttons')
return { button: function(button) {
var ignore_bootstrap = button.ignore_bootstrap || false
var b = s2.append('label')
b.append('input').attr('type', 'radio')
_button_with_sel(b, button)
return this
}}
}
function button_group(s) {
var s2 = s.attr('class', 'btn-group-vertical');
return { button: function(button) {
var b = s2.append("button")
_button_with_sel(b, button)
return this;
}};
}
function dropdown_menu(s, name, pull_right) {
if (pull_right === undefined) pull_right = false;
var s2 = s.append('li')
.attr('class', 'dropdown');
s2.append('button').text(name+" ")
.attr('class', 'btn btn-link btn-sm dropdown-button')
.attr('data-toggle', 'dropdown')
.append('b').attr('class', 'caret');
var ul = s2.append('ul')
.attr('class', 'dropdown-menu')
.classed('pull-right', pull_right)
.attr('role', 'menu')
.attr('aria-labelledby', 'dLabel');
return {
dropdown: s2,
button: function(button) {
var li = ul.append("li")
.attr('role', 'presentation')
.datum(button),
link = li.append("a")
.attr('href', '#'),
icon = link.append('span')
.attr('class', 'dropdown-button-icon'),
text = link.append('span')
.attr('class', 'dropdown-button-text');
if ('id' in button) li.attr('id', button.id);
// text
if ('key_text' in button && 'text' in button && button.key_text !== null)
text.text(" "+button.text + button.key_text);
else if ('text' in button)
text.text(" "+button.text);
if ('icon' in button) icon.classed(button.icon, true);
if ('key' in button) {
set_button(link, button.key);
} else if ('input' in button) {
var input = button.input,
out = (input.accept_csv ?
set_json_or_csv_input_button(link, li, input.pre_fn,
input.fn, input.failure_fn) :
set_json_input_button(link, li, input.pre_fn,
input.fn, input.failure_fn));
// assign a function to the key
if ('assign' in input && 'key' in input)
input.assign[input.key] = out;
}
return this;
},
divider: function() {
ul.append("li")
.attr('role', 'presentation')
.attr('class', 'divider');
return this;
}
};
}
function set_button(b, key) {
b.on("click", function() {
key.fn.call(key.target);
});
}
function set_json_input_button(b, s, pre_fn, post_fn, failure_fn) {
var input = s.append("input")
.attr("type", "file")
.style("display", "none")
.on("change", function() {
utils.load_json(this.files[0],
function(e, d) {
post_fn(e, d);
this.value = "";
}.bind(this),
pre_fn,
failure_fn);
});
b.on('click', function(e) {
input.node().click();
});
return function() { input.node().click(); };
}
function set_json_or_csv_input_button(b, s, pre_fn, post_fn, failure_fn) {
var input = s.append("input")
.attr("type", "file")
.style("display", "none")
.on("change", function() {
utils.load_json_or_csv(this.files[0],
data_styles.csv_converter,
function(e, d) {
post_fn(e, d);
this.value = "";
}.bind(this),
pre_fn,
failure_fn);
});
b.on('click', function(e) {
input.node().click();
});
return function() { input.node().click(); };
}