Revise shared utilities

This commit is contained in:
guerler
2018-02-11 14:35:16 -05:00
parent de7cac9053
commit 00a105ef6a
6 changed files with 95 additions and 326 deletions
+3 -3
View File
@@ -1,7 +1,7 @@
import * as _ from "libs/underscore";
import Client from "mvc/visualization/chart/chart-client";
import Datasets from "mvc/visualization/chart/utilities/datasets";
import Helpers from "mvc/visualization/chart/utilities/helpers";
import Series from "mvc/visualization/chart/utilities/series";
import Jobs from "mvc/visualization/chart/utilities/jobs";
window.bundleEntries = window.bundleEntries || {};
@@ -12,8 +12,8 @@ export const bundleEntries = {
},
chartUtilities: {
Datasets: Datasets,
Helpers: Helpers,
Jobs: Jobs
Jobs: Jobs,
Series: Series
}
};
@@ -1,6 +1,50 @@
/** This class handles, formats and caches datasets. */
import Utils from "utils/utils";
/** Assists in assigning the viewport panels */
var requestPanels = function(options) {
var self = this;
var process = options.process;
var chart = options.chart;
var render = options.render;
var targets = options.targets;
var dataset_id = options.dataset_id || options.chart.get("dataset_id");
var dataset_groups = options.dataset_groups || options.chart.groups;
request({
chart: chart,
dataset_id: dataset_id,
dataset_groups: dataset_groups,
success: function(result) {
try {
if (targets.length == result.length) {
var valid = true;
for (var group_index in result) {
var group = result[group_index];
if (!render(targets[group_index], [group])) {
valid = false;
break;
}
}
if (valid) {
chart.state("ok", "Multi-panel chart drawn.");
}
} else if (targets.length == 1) {
if (render(targets[0], result)) {
chart.state("ok", "Chart drawn.");
}
} else {
chart.state("failed", "Invalid panel count.");
}
process.resolve();
} catch (err) {
console.debug("FAILED: tabular-utilities::panelHelper() - " + err);
chart.state("failed", err);
process.reject();
}
}
});
}
/** Fills request dictionary with data from cache/response */
var _cache = {};
var request = function(options) {
@@ -124,4 +168,4 @@ var _block_id = function(dataset_id, column) {
return dataset_id + "_" + "_" + column;
};
export default { request: request };
export default { request: request, requestPanels: requestPanels };
@@ -1,310 +0,0 @@
import Utils from "utils/utils";
import Datasets from "mvc/visualization/chart/utilities/datasets";
/** build job dictionary */
function buildJobDictionary(chart, module) {
var settings_string = "";
var columns_string = "";
var group_index = 0;
for (var key in chart.settings.attributes) {
var settings_value = chart.settings.get(key);
_.each([[" ", " "], [",", ","], [":", ":"]], function(pair) {
settings_value = settings_value.replace(new RegExp(pair[0], "g"), pair[1]);
});
settings_string += key + ":" + settings_value + ", ";
}
settings_string = settings_string.substring(0, settings_string.length - 2);
chart.groups.each(function(group) {
group_index++;
_.each(group.get("__data_columns"), function(data_columns, name) {
columns_string += name + "_" + group_index + ":" + (parseInt(group.get(name)) + 1) + ", ";
});
});
columns_string = columns_string.substring(0, columns_string.length - 2);
return {
tool_id: "charts",
inputs: {
input: {
id: chart.get("dataset_id"),
src: "hda"
},
module: module,
columns: columns_string,
settings: settings_string
}
};
}
/** Assists in assigning the viewport panels */
function panelHelper(options) {
var self = this;
var process = options.process;
var chart = options.chart;
var render = options.render;
var targets = options.targets;
var dataset_id = options.dataset_id || options.chart.get("dataset_id");
var dataset_groups = options.dataset_groups || options.chart.groups;
Datasets.request({
chart: chart,
dataset_id: dataset_id,
dataset_groups: dataset_groups,
success: function(result) {
try {
if (targets.length == result.length) {
var valid = true;
for (var group_index in result) {
var group = result[group_index];
if (!render(targets[group_index], [group])) {
valid = false;
break;
}
}
if (valid) {
chart.state("ok", "Multi-panel chart drawn.");
}
} else if (targets.length == 1) {
if (render(targets[0], result)) {
chart.state("ok", "Chart drawn.");
}
} else {
chart.state("failed", "Invalid panel count.");
}
process.resolve();
} catch (err) {
console.debug("FAILED: tabular-utilities::panelHelper() - " + err);
chart.state("failed", err);
process.reject();
}
}
});
}
/** Get domain boundaries value */
function getDomains(groups, keys) {
function _apply(operator, key) {
var value = undefined;
for (var group_index in groups) {
var value_sub = d3[operator](groups[group_index].values, function(d) {
return d[key];
});
value = value === undefined ? value_sub : Math[operator](value, value_sub);
}
return value;
}
var result = {};
for (var index in keys) {
var key = keys[index];
result[key] = {
min: _apply("min", key),
max: _apply("max", key)
};
}
return result;
}
/** Default series maker */
function makeSeries(groups, keys) {
var plot_data = [];
for (var group_index in groups) {
var group = groups[group_index];
var data = [];
for (var value_index in group.values) {
var point = [];
if (keys) {
for (var key_index in keys) {
var column_index = keys[key_index];
point.push(group.values[value_index][column_index]);
}
} else {
for (var column_index in group.values[value_index]) {
point.push(group.values[value_index][column_index]);
}
}
data.push(point);
}
plot_data.push(data);
}
return plot_data;
}
/** Default category maker */
function makeCategories(groups, column_keys) {
var array = {};
var data_columns = groups[0].__data_columns;
_.each(column_keys, function(key) {
if (data_columns[key].is_label) {
array[key] = [];
}
});
if (groups && groups[0]) {
_.each(groups[0].values, function(value_dict) {
for (var key in array) {
array[key].push(String(value_dict[key]));
}
});
}
mapCategories(array, groups);
return { array: array };
}
/** Apply default mapping index all values contained in label columns (for all groups) */
function mapCategories(array, groups) {
_.each(groups, function(group) {
_.each(group.values, function(value_dict, i) {
for (var key in array) {
value_dict[key] = parseInt(i);
}
});
});
}
/** Category make for unique category labels */
function makeUniqueCategories(groups, with_index) {
var categories = {};
var array = {};
var counter = {};
var data_columns = groups[0].__data_columns;
_.each(data_columns, function(column_def, key) {
if (column_def.is_label) {
categories[key] = {};
array[key] = [];
counter[key] = 0;
}
});
// index all values contained in label columns (for all groups)
for (var i in groups) {
var group = groups[i];
for (var j in group.values) {
var value_dict = group.values[j];
for (var key in categories) {
var value = String(value_dict[key]);
if (categories[key][value] === undefined) {
categories[key][value] = counter[key];
array[key].push(with_index ? [counter[key], value] : value);
counter[key]++;
}
}
}
}
// convert group values into category indeces
for (var i in groups) {
var group = groups[i];
for (var j in group.values) {
var value_dict = group.values[j];
for (var key in categories) {
var value = String(value_dict[key]);
value_dict[key] = categories[key][value];
}
}
}
return {
categories: categories,
array: array,
counter: counter
};
}
/** Make axis */
function makeTickFormat(options) {
var type = options.type;
var precision = options.precision;
var categories = options.categories;
var formatter = options.formatter;
if (type == "hide") {
formatter(function() {
return "";
});
} else if (type == "auto") {
if (categories) {
formatter(function(value) {
return categories[value] || "";
});
}
} else {
var d3format = function(d) {
switch (type) {
case "s":
var prefix = d3.formatPrefix(d);
return prefix.scale(d).toFixed() + prefix.symbol;
default:
return d3.format("." + precision + type)(d);
}
};
if (categories) {
formatter(function(value) {
var label = categories[value];
if (label) {
if (isNaN(label)) {
return label;
} else {
try {
return d3format(label);
} catch (err) {
return label;
}
}
} else {
return "";
}
});
} else {
formatter(function(value) {
return d3format(value);
});
}
}
}
/** Add zoom handler */
function addZoom(options) {
var scaleExtent = 100;
var yAxis = options.yAxis;
var xAxis = options.xAxis;
var xDomain = options.xDomain || xAxis.scale().domain;
var yDomain = options.yDomain || yAxis.scale().domain;
var redraw = options.redraw;
var svg = options.svg;
var xScale = xAxis.scale();
var yScale = yAxis.scale();
var x_boundary = xScale.domain().slice();
var y_boundary = yScale.domain().slice();
var d3zoom = d3.behavior.zoom();
xScale.nice();
yScale.nice();
function fixDomain(domain, boundary) {
domain[0] = Math.min(Math.max(domain[0], boundary[0]), boundary[1] - boundary[1] / scaleExtent);
domain[1] = Math.max(boundary[0] + boundary[1] / scaleExtent, Math.min(domain[1], boundary[1]));
return domain;
}
function zoomed() {
yDomain(fixDomain(yScale.domain(), y_boundary));
xDomain(fixDomain(xScale.domain(), x_boundary));
redraw();
}
function unzoomed() {
xDomain(x_boundary);
yDomain(y_boundary);
redraw();
d3zoom.scale(1);
d3zoom.translate([0, 0]);
}
d3zoom
.x(xScale)
.y(yScale)
.scaleExtent([1, scaleExtent])
.on("zoom", zoomed);
svg.call(d3zoom).on("dblclick.zoom", unzoomed);
return d3zoom;
}
export default {
buildJobDictionary: buildJobDictionary,
panelHelper: panelHelper,
makeCategories: makeCategories,
makeUniqueCategories: makeUniqueCategories,
makeSeries: makeSeries,
getDomains: getDomains,
mapCategories: mapCategories,
makeTickFormat: makeTickFormat,
addZoom: addZoom
};
@@ -4,6 +4,40 @@ import Utils from "utils/utils";
/** Time to wait before refreshing to check if job has completed */
var WAITTIME = 1000;
/** build job dictionary */
var requestCharts = function(chart, module) {
var settings_string = "";
var columns_string = "";
var group_index = 0;
for (var key in chart.settings.attributes) {
var settings_value = chart.settings.get(key);
_.each([[" ", " "], [",", ","], [":", ":"]], function(pair) {
settings_value = settings_value.replace(new RegExp(pair[0], "g"), pair[1]);
});
settings_string += key + ":" + settings_value + ", ";
}
settings_string = settings_string.substring(0, settings_string.length - 2);
chart.groups.each(function(group) {
group_index++;
_.each(group.get("__data_columns"), function(data_columns, name) {
columns_string += name + "_" + group_index + ":" + (parseInt(group.get(name)) + 1) + ", ";
});
});
columns_string = columns_string.substring(0, columns_string.length - 2);
return {
tool_id: "charts",
inputs: {
input: {
id: chart.get("dataset_id"),
src: "hda"
},
module: module,
columns: columns_string,
settings: settings_string
}
};
}
/** Submit job request to charts tool */
var request = function(chart, parameters, success, error) {
chart.state("wait", "Requesting job results...");
@@ -113,4 +147,4 @@ var refreshHdas = function() {
Galaxy && Galaxy.currHistoryPanel && Galaxy.currHistoryPanel.refreshContents();
};
export default { request: request };
export default { request: request, requestCharts: requestCharts };
@@ -3,7 +3,8 @@ import * as d3 from "d3";
import * as nv from "nvd3";
import "../node_modules/nvd3/build/nv.d3.css";
var Utilities = window.bundleEntries.chartUtilities.Helpers;
var Series = window.bundleEntries.chartUtilities.Series;
var Datasets = window.bundleEntries.chartUtilities.Datasets;
var CommonWrapper = Backbone.View.extend({
initialize: function(options) {
@@ -12,7 +13,7 @@ var CommonWrapper = Backbone.View.extend({
options.render = function(canvas_id, groups) {
return self.render(canvas_id, groups);
};
Utilities.panelHelper(options);
Datasets.requestPanels(options);
},
render: function(canvas_id, groups) {
var self = this;
@@ -48,7 +49,7 @@ var CommonWrapper = Backbone.View.extend({
if (d3chart.clipEdge) {
d3chart.clipEdge(true);
}
Utilities.addZoom({
Series.addZoom({
xAxis: d3chart.xAxis,
yAxis: d3chart.yAxis,
yDomain: d3chart.yDomain,
@@ -70,9 +71,9 @@ var CommonWrapper = Backbone.View.extend({
/** Format axes ticks */
_makeAxes: function(d3chart, groups, settings) {
var categories = Utilities.makeCategories(groups, ["x", "y"]);
var categories = Series.makeCategories(groups, ["x", "y"]);
function makeTickFormat(id) {
Utilities.makeTickFormat({
Series.makeTickFormat({
categories: categories.array[id],
type: settings.get(id + "_axis_type|type"),
precision: settings.get(id + "_axis_type|precision"),
File diff suppressed because one or more lines are too long