mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
Charts: Save/read from backend
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user