Charts: Save/read from backend

This commit is contained in:
Aysam Guerler
2014-03-22 13:38:48 -04:00
parent 292444eedf
commit ce60083099
8 changed files with 172 additions and 67 deletions
@@ -32,7 +32,7 @@ return Backbone.View.extend(
// create chart models
this.types = new Types();
this.chart = new Chart();
this.charts = new Charts();
this.charts = new Charts(null, this);
// create dataset handler
this.datasets = new Datasets(this);
@@ -59,9 +59,6 @@ return Backbone.View.extend(
this.setElement(this.portlet);
}
// start with chart view
this.go('chart_view');
// events
var self = this;
this.config.on('change:title', function() {
@@ -70,6 +67,16 @@ return Backbone.View.extend(
// render
this.render();
// load charts
this.charts.load();
// start with chart view
if (this.charts.length == 0) {
this.go('chart_view');
} else {
this.go('charts_view');
}
},
// loads a view and makes sure that all others are hidden
File diff suppressed because one or more lines are too long
@@ -65,7 +65,7 @@ return Backbone.View.extend(
nv.utils.windowResize(nvd3_model.update);
// set chart state
chart.set('state', 'ok');
chart.state('ok', 'Chart has been drawn.');
});
});
}
@@ -13,6 +13,20 @@ return Backbone.Model.extend(
this.options = Utils.merge(options, this.optionsDefault);
},
// clean
cleanup: function(chart) {
// cleanup previous dataset file
var previous = chart.get('dataset_id_job');
if (previous) {
var self = this;
Utils.request('PUT', config.root + 'api/histories/none/contents/' + previous, { deleted: true }, function() {
// update galaxy history
self._refreshHdas();
});
}
},
// create job
submit: function(chart, settings_string, columns_string, callback) {
// link this
@@ -39,11 +53,8 @@ return Backbone.Model.extend(
}
}
// cleanup previous dataset file
var previous = chart.get('dataset_id_job');
if (previous) {
Utils.request('PUT', config.root + 'api/histories/' + chart.get('history_id') + '/contents/' + previous, { deleted: true });
}
// cleanup
self.cleanup(chart);
// set chart state
chart.state('submit', 'Sending job request...');
@@ -56,9 +67,7 @@ return Backbone.Model.extend(
chart.state('failed', 'Job submission failed. No response.');
} else {
// update galaxy history
if (Galaxy && Galaxy.currHistoryPanel) {
Galaxy.currHistoryPanel.refreshHdas();
}
self._refreshHdas();
// get dataset
var job = response.outputs[0];
@@ -105,6 +114,14 @@ return Backbone.Model.extend(
setTimeout(function() { self._loop(id, callback); }, self.app.config.get('query_timeout'));
}
});
},
// refresh history panel
_refreshHdas: function() {
// update galaxy history
if (Galaxy && Galaxy.currHistoryPanel) {
Galaxy.currHistoryPanel.refreshHdas();
}
}
});
@@ -1,30 +1,113 @@
// dependencies
define(['plugin/models/chart'], function(Chart) {
define(['plugin/models/chart', 'plugin/models/group'], function(Chart, Group) {
// collection
return Backbone.Collection.extend(
{
model: Chart,
// nested chart model contains collections
model : Chart,
// save charts
save: function() {
// viz model
vis: null,
// initialize
initialize: function(options, app) {
// initialize parameters
this.app = app;
this.id = this.app.options.id;
// create visualization
var vis = new Visualization({
type : 'charts',
this.vis = new Visualization({
type : 'charts',
config : {
charts : []
dataset_id : this.app.options.config.dataset_id,
charts : []
}
});
// copy attributes
//vis.set(this.attributes);
// add visualization id
if (this.id) {
this.vis.id = this.id;
}
// add charts
var charts_array = this.app.options.config.charts;
if (charts_array) {
this.vis.get('config').charts = charts_array;
}
},
// pack and save nested chart models
save: function() {
// reset
this.vis.get('config').charts = [];
// pack nested chart models into arrays attributes
var self = this;
this.each(function(chart) {
// create chart dictionary
var chart_dict = {
attributes : chart.attributes,
settings : chart.settings.attributes,
groups : []
};
// append groups
chart.groups.each(function(group) {
chart_dict.groups.push(group.attributes);
});
// add chart to charts array
self.vis.get('config').charts.push(chart_dict);
});
// save visualization
vis.save()
.fail( function( xhr, status, message ){
console.error( xhr, status, message );
alert( 'Error loading data:\n' + xhr.responseText );
var self = this;
this.vis.save()
.fail(function(xhr, status, message) {
console.error(xhr, status, message);
alert( 'Error loading data:\n' + xhr.responseText );
})
.then(function(response) {
if (response && response.id) {
self.id = response.id;
}
});
},
// load nested models/collections from packed dictionary
load: function() {
// get charts array
var charts_array = this.vis.get('config').charts;
// unpack chart models
for (var i in charts_array) {
// get chart details
var chart_dict = charts_array[i];
// construct chart model
var chart = new Chart();
// main
chart.set(chart_dict.attributes);
// get settings
chart.settings.set(chart_dict.settings);
// get groups
for (var j in chart_dict.groups) {
chart.groups.add(new Group(chart_dict.groups[j]));
}
// reset status
chart.state('ok', 'Loaded previously saved visualization.');
// add to collection
this.add(chart);
// trigger
chart.trigger('redraw', chart);
}
}
});
@@ -78,20 +78,25 @@ return Backbone.View.extend(
// title
var chart = self.app.charts.get(chart_id);
// show modal
self.app.modal.show({
title : 'Are you sure?',
body : 'The selected chart "' + chart.get('title') + '" will be irreversibly deleted.',
buttons : {
'Cancel' : function() {self.app.modal.hide();},
'Delete' : function() {
// hide modal
self.app.modal.hide();
// remove chart
self.app.charts.remove(chart_id);
// make sure that chart is ready
self._wait (chart, function() {
self.app.modal.show({
title : 'Are you sure?',
body : 'The selected chart "' + chart.get('title') + '" will be irreversibly deleted.',
buttons : {
'Cancel' : function() {self.app.modal.hide();},
'Delete' : function() {
// hide modal
self.app.modal.hide();
// remove chart
self.app.charts.remove(chart_id);
// cleanup
self.app.jobs.cleanup(chart);
}
}
}
});
});
}
}),
@@ -185,14 +190,19 @@ return Backbone.View.extend(
// show chart editor
_showChartView: function(chart_id) {
// get chart
var self = this;
var chart = this.app.charts.get(chart_id);
this._wait (chart, function() {
self.app.go('chart_view');
self.app.chart.copy(chart);
});
},
// wait for chart to be ready
_wait: function(chart, callback) {
// get chart
if (chart.ready()) {
// show chart view
this.app.go('chart_view');
// load chart into view
this.app.chart.copy(chart);
callback();
} else {
// show modal
var self = this;
@@ -206,7 +216,7 @@ return Backbone.View.extend(
self.app.modal.hide();
// retry
self._showChartView(chart_id);
setTimeout(function() { self._wait(chart, callback); }, self.app.config.get('query_timeout'));
}
}
});
@@ -43,17 +43,7 @@ return Backbone.View.extend(
// redraw
this.app.charts.on('redraw', function(chart) {
// redraw if chart is not currently processed
if (chart.ready()) {
self._refreshChart(chart);
} else {
// redraw once current drawing process has finished
chart.on('change:state', function() {
if (chart.ready()) {
self._refreshChart(chart);
}
});
}
self._drawChart(chart);
});
},
@@ -69,7 +59,7 @@ return Backbone.View.extend(
var item = this.list[chart_id];
if (item) {
// get chart
var chart = self.app.charts.get(chart_id);
var chart = this.app.charts.get(chart_id);
// update portlet
this.portlet.title(chart.get('title'));
@@ -100,13 +90,13 @@ return Backbone.View.extend(
},
// add
_refreshChart: function(chart) {
_drawChart: function(chart) {
// link this
var self = this;
// check
if (!chart.ready()) {
self.app.log('viewport:_refreshChart()', 'Invalid attempt to refresh chart before completion.');
self.app.log('viewport:_drawChart()', 'Invalid attempt to draw chart before completion.');
return;
}
@@ -126,7 +116,7 @@ return Backbone.View.extend(
this.portlet.append($chart_el);
// find svg element
var svg = d3.select(id + ' svg');
var svg = d3.select($chart_el.find('svg')[0]);
// add chart to list
this.list[chart_id] = {
@@ -134,9 +124,6 @@ return Backbone.View.extend(
$el : $chart_el
}
// show chart from list
this.showChart(chart_id);
// clear all previous handlers (including redraw listeners)
chart.off('change:state');
@@ -172,7 +159,7 @@ return Backbone.View.extend(
// set chart state
chart.state('wait', 'Please wait...');
// identify chart type
var chart_type = chart.get('type');
var chart_settings = this.app.types.get(chart_type);
@@ -71,9 +71,10 @@
require(['plugin/app'], function(App) {
// load options
var options = {
id : ${h.to_json_string( visualization_id )} || undefined,
config : ${h.to_json_string( config )}
}
console.log(options);
// create application
app = new App(options);