diff --git a/client/galaxy/scripts/mvc/collection/collection-li.js b/client/galaxy/scripts/mvc/collection/collection-li.js
index 9fea9eb7dfa..1c679f486d5 100644
--- a/client/galaxy/scripts/mvc/collection/collection-li.js
+++ b/client/galaxy/scripts/mvc/collection/collection-li.js
@@ -125,6 +125,8 @@ DCListItemView.prototype.templates = (function(){
_l( 'a pair of datasets' ),
'<% } else if( collection.collection_type === "list:paired" ){ %>',
_l( 'a list of <%- countText %>dataset pairs' ),
+ '<% } else if( collection.collection_type === "list:list" ){ %>',
+ _l( 'a list of <%- countText %>dataset lists' ),
'<% } %>',
''
], 'collection' );
diff --git a/client/galaxy/scripts/mvc/collection/collection-model.js b/client/galaxy/scripts/mvc/collection/collection-model.js
index 4fa44c3ff45..27b89690cef 100644
--- a/client/galaxy/scripts/mvc/collection/collection-model.js
+++ b/client/galaxy/scripts/mvc/collection/collection-model.js
@@ -504,10 +504,58 @@ var ListPairedDatasetCollection = DatasetCollection.extend(
});
+//==============================================================================
+/** @class Backbone model for a list dataset collection within a list:list dataset collection. */
+var NestedListDCDCE = ListDatasetCollection.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,
+/** @lends NestedListDCDCE.prototype */{
+
+ /** This is both a collection and a collection element - call the constructor */
+ constructor : function( attributes, options ){
+ this.debug( '\t NestedListDCDCE.constructor:', attributes, options );
+ DatasetCollectionElementMixin.constructor.call( this, attributes, options );
+ },
+
+ /** String representation. */
+ toString : function(){
+ var objStr = ( this.object )?( '' + this.object ):( this.get( 'element_identifier' ) );
+ return ([ 'NestedListDCDCE(', objStr, ')' ].join( '' ));
+ }
+}));
+
+
+//==============================================================================
+/** @class Backbone collection containing list dataset collections. */
+var NestedListDCDCECollection = NestedDCDCECollection.extend({
+
+ /** We know this collection is composed of only nested pair collections */
+ model: NestedListDCDCE,
+
+ /** String representation. */
+ toString : function(){
+ return ([ 'NestedListDCDCECollection(', this.length, ')' ].join( '' ));
+ }
+});
+
+
+//==============================================================================
+/** @class Backbone Model for a DatasetCollection (list) that contains other lists. */
+var ListOfListsDatasetCollection = DatasetCollection.extend({
+
+ /** list:paired is the only collection that itself contains collections */
+ collectionClass : NestedListDCDCECollection,
+
+ /** String representation. */
+ toString : function(){
+ return ([ 'ListOfListsDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));
+ }
+});
+
+
//==============================================================================
return {
- ListDatasetCollection : ListDatasetCollection,
- PairDatasetCollection : PairDatasetCollection,
- ListPairedDatasetCollection : ListPairedDatasetCollection
+ ListDatasetCollection : ListDatasetCollection,
+ PairDatasetCollection : PairDatasetCollection,
+ ListPairedDatasetCollection : ListPairedDatasetCollection,
+ ListOfListsDatasetCollection: ListOfListsDatasetCollection
};
});
diff --git a/client/galaxy/scripts/mvc/collection/collection-view-edit.js b/client/galaxy/scripts/mvc/collection/collection-view-edit.js
index d07e25037bd..d2e7fdc5dc2 100644
--- a/client/galaxy/scripts/mvc/collection/collection-view-edit.js
+++ b/client/galaxy/scripts/mvc/collection/collection-view-edit.js
@@ -128,7 +128,7 @@ var NestedPairCollectionViewEdit = PairCollectionViewEdit.extend(
// =============================================================================
-/** @class non-editable, read-only View/Controller for a dataset collection. */
+/** @class editable, View/Controller for a list of pairs dataset collection. */
var ListOfPairsCollectionViewEdit = CollectionViewEdit.extend(
/** @lends ListOfPairsCollectionView.prototype */{
@@ -146,11 +146,31 @@ var ListOfPairsCollectionViewEdit = CollectionViewEdit.extend(
});
+// =============================================================================
+/** @class View/Controller for a list of lists dataset collection. */
+var ListOfListsCollectionViewEdit = CollectionViewEdit.extend(
+/** @lends ListOfListsCollectionView.prototype */{
+
+ //TODO: not strictly needed - due to switch in CollectionView._getContentClass
+ /** sub view class used for nested collections */
+ NestedDCDCEViewClass : DC_EDIT.NestedDCDCEListItemEdit.extend({
+ foldoutPanelClass : NestedPairCollectionViewEdit
+ }),
+
+ // ........................................................................ misc
+ /** string rep */
+ toString : function(){
+ return 'ListOfListsCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';
+ }
+});
+
+
//==============================================================================
return {
CollectionViewEdit : CollectionViewEdit,
ListCollectionViewEdit : ListCollectionViewEdit,
PairCollectionViewEdit : PairCollectionViewEdit,
- ListOfPairsCollectionViewEdit : ListOfPairsCollectionViewEdit
+ ListOfPairsCollectionViewEdit : ListOfPairsCollectionViewEdit,
+ ListOfListsCollectionViewEdit : ListOfListsCollectionViewEdit
};
});
diff --git a/client/galaxy/scripts/mvc/collection/collection-view.js b/client/galaxy/scripts/mvc/collection/collection-view.js
index 8178ea17105..99993810e6f 100644
--- a/client/galaxy/scripts/mvc/collection/collection-view.js
+++ b/client/galaxy/scripts/mvc/collection/collection-view.js
@@ -153,6 +153,8 @@ CollectionView.prototype.templates = (function(){
_l( 'a pair of datasets' ),
'<% } else if( collection.collection_type === "list:paired" ){ %>',
_l( 'a list of paired datasets' ),
+ '<% } else if( collection.collection_type === "list:list" ){ %>',
+ _l( 'a list of dataset lists' ),
'<% } %>',
'',
'',
@@ -215,11 +217,28 @@ var ListOfPairsCollectionView = CollectionView.extend(
});
+// =============================================================================
+/** @class non-editable, read-only View/Controller for a list of lists dataset collection. */
+var ListOfListsCollectionView = CollectionView.extend({
+
+ /** sub view class used for nested collections */
+ NestedDCDCEViewClass : DC_LI.NestedDCDCEListItemView.extend({
+ foldoutPanelClass : PairCollectionView
+ }),
+
+ /** string rep */
+ toString : function(){
+ return 'ListOfListsCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';
+ }
+});
+
+
//==============================================================================
return {
CollectionView : CollectionView,
ListCollectionView : ListCollectionView,
PairCollectionView : PairCollectionView,
- ListOfPairsCollectionView : ListOfPairsCollectionView
+ ListOfPairsCollectionView : ListOfPairsCollectionView,
+ ListOfListsCollectionView : ListOfListsCollectionView
};
});
diff --git a/client/galaxy/scripts/mvc/dataset/data.js b/client/galaxy/scripts/mvc/dataset/data.js
index 3a392b1702a..309dd20f92a 100644
--- a/client/galaxy/scripts/mvc/dataset/data.js
+++ b/client/galaxy/scripts/mvc/dataset/data.js
@@ -64,7 +64,7 @@ var TabularDataset = Dataset.extend({
defaults: _.extend({}, Dataset.prototype.defaults, {
chunk_url: null,
first_data_chunk: null,
- chunk_index: -1,
+ offset: 0,
at_eof: false
}),
@@ -72,7 +72,9 @@ var TabularDataset = Dataset.extend({
Dataset.prototype.initialize.call(this);
// If first data chunk is available, next chunk is 1.
- this.attributes.chunk_index = (this.attributes.first_data_chunk ? 1 : 0);
+ if (this.attributes.first_data_chunk){
+ this.attributes.offset = this.attributes.first_data_chunk.offset;
+ }
this.attributes.chunk_url = Galaxy.root + 'dataset/display?dataset_id=' + this.id;
this.attributes.url_viz = Galaxy.root + 'visualization';
},
@@ -90,12 +92,13 @@ var TabularDataset = Dataset.extend({
var self = this,
next_chunk = $.Deferred();
$.getJSON(this.attributes.chunk_url, {
- chunk: self.attributes.chunk_index++
+ offset: self.attributes.offset
}).success(function(chunk) {
var rval;
if (chunk.ck_data !== '') {
// Found chunk.
rval = chunk;
+ self.attributes.offset = chunk.offset;
}
else {
// At EOF.
diff --git a/client/galaxy/scripts/mvc/history/hdca-li-edit.js b/client/galaxy/scripts/mvc/history/hdca-li-edit.js
index 0cc3f4623ba..0960b94ad7f 100644
--- a/client/galaxy/scripts/mvc/history/hdca-li-edit.js
+++ b/client/galaxy/scripts/mvc/history/hdca-li-edit.js
@@ -26,6 +26,8 @@ var HDCAListItemEdit = _super.extend(
return DC_VIEW_EDIT.PairCollectionViewEdit;
case 'list:paired':
return DC_VIEW_EDIT.ListOfPairsCollectionViewEdit;
+ case 'list:list':
+ return DC_VIEW_EDIT.ListOfListsCollectionViewEdit;
}
throw new TypeError( 'Uknown collection_type: ' + this.model.get( 'collection_type' ) );
},
diff --git a/client/galaxy/scripts/mvc/history/hdca-li.js b/client/galaxy/scripts/mvc/history/hdca-li.js
index 3d6289f38cd..9959ad66c56 100644
--- a/client/galaxy/scripts/mvc/history/hdca-li.js
+++ b/client/galaxy/scripts/mvc/history/hdca-li.js
@@ -38,6 +38,8 @@ var HDCAListItemView = _super.extend(
return DC_VIEW.PairCollectionView;
case 'list:paired':
return DC_VIEW.ListOfPairsCollectionView;
+ case 'list:list':
+ return DC_VIEW.ListOfListsCollectionView;
}
throw new TypeError( 'Uknown collection_type: ' + this.model.get( 'collection_type' ) );
},
diff --git a/client/galaxy/scripts/mvc/history/hdca-model.js b/client/galaxy/scripts/mvc/history/hdca-model.js
index 96576d1cb63..93ffaca7253 100644
--- a/client/galaxy/scripts/mvc/history/hdca-model.js
+++ b/client/galaxy/scripts/mvc/history/hdca-model.js
@@ -18,7 +18,8 @@ TODO:
var hcontentMixin = HISTORY_CONTENT.HistoryContentMixin,
ListDC = DC_MODEL.ListDatasetCollection,
PairDC = DC_MODEL.PairDatasetCollection,
- ListPairedDC = DC_MODEL.ListPairedDatasetCollection;
+ ListPairedDC = DC_MODEL.ListPairedDatasetCollection,
+ ListOfListsDC = DC_MODEL.ListOfListsDatasetCollection;
//==============================================================================
/** Override to post to contents route w/o id. */
@@ -91,11 +92,8 @@ var HistoryPairDatasetCollection = PairDC.extend( hcontentMixin ).extend(
//==============================================================================
-/** @class Backbone model for List of Pairs Dataset Collection within a History.
- * @constructs
- */
-var HistoryListPairedDatasetCollection = ListPairedDC.extend( hcontentMixin ).extend(
-/** @lends HistoryListPairedDatasetCollection.prototype */{
+/** @class Backbone model for List of Pairs Dataset Collection within a History. */
+var HistoryListPairedDatasetCollection = ListPairedDC.extend( hcontentMixin ).extend({
defaults : _.extend( _.clone( ListPairedDC.prototype.defaults ), {
history_content_type: 'dataset_collection',
@@ -118,10 +116,36 @@ var HistoryListPairedDatasetCollection = ListPairedDC.extend( hcontentMixin ).ex
});
+//==============================================================================
+/** @class Backbone model for List of Lists Dataset Collection within a History. */
+var HistoryListOfListsDatasetCollection = ListOfListsDC.extend( hcontentMixin ).extend({
+
+ defaults : _.extend( _.clone( ListOfListsDC.prototype.defaults ), {
+ history_content_type: 'dataset_collection',
+ collection_type : 'list:list',
+ model_class : 'HistoryDatasetCollectionAssociation'
+ }),
+
+ initialize : function( model, options ){
+ ListOfListsDC.prototype.initialize.call( this, model, options );
+ hcontentMixin.initialize.call( this, model, options );
+ },
+
+ /** Override to post to contents route w/o id. */
+ save : buildHDCASave( ListOfListsDC.prototype.save ),
+
+ /** String representation. */
+ toString : function(){
+ return ([ 'HistoryListOfListsDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));
+ }
+});
+
+
//==============================================================================
return {
HistoryListDatasetCollection : HistoryListDatasetCollection,
HistoryPairDatasetCollection : HistoryPairDatasetCollection,
- HistoryListPairedDatasetCollection : HistoryListPairedDatasetCollection
+ HistoryListPairedDatasetCollection : HistoryListPairedDatasetCollection,
+ HistoryListOfListsDatasetCollection : HistoryListOfListsDatasetCollection
};
});
diff --git a/client/galaxy/scripts/mvc/history/history-contents.js b/client/galaxy/scripts/mvc/history/history-contents.js
index a08eec492e3..62943e56bf9 100644
--- a/client/galaxy/scripts/mvc/history/history-contents.js
+++ b/client/galaxy/scripts/mvc/history/history-contents.js
@@ -44,12 +44,16 @@ var HistoryContents = Backbone.Collection
return new HDCA_MODEL.HistoryPairDatasetCollection( attrs, options );
case 'list:paired':
return new HDCA_MODEL.HistoryListPairedDatasetCollection( attrs, options );
+ case 'list:list':
+ return new HDCA_MODEL.HistoryListOfListsDatasetCollection( attrs, options );
}
// This is a hack inside a hack:
// Raise a plain object with validationError to fake a model.validationError
// (since we don't have a model to use validate with)
// (the outer hack being the mixed content/model function in this collection)
- return { validationError : 'Unknown collection_type: ' + attrs.history_content_type };
+ var msg = 'Unknown collection_type: ' + attrs.collection_type;
+ console.warn( msg, attrs );
+ return { validationError : msg };
}
return { validationError : 'Unknown history_content_type: ' + attrs.history_content_type };
},
@@ -281,10 +285,14 @@ var HistoryContents = Backbone.Collection
type = ( contentType === 'hdca'? 'dataset_collection' : 'dataset' );
}
var collection = this,
- xhr = jQuery.post( this.url(), {
- content : id,
- source : contentType,
- type : type
+ xhr = jQuery.ajax( this.url(), {
+ method: 'POST',
+ contentType: 'application/json',
+ data: JSON.stringify({
+ content : id,
+ source : contentType,
+ type : type
+ })
})
.done( function( response ){
collection.add([ response ]);
diff --git a/config/plugins/visualizations/graphviz/config/graphviz.xml b/config/plugins/visualizations/graphviz/config/graphviz.xml
index 1a51da4c699..ab0fea5d719 100644
--- a/config/plugins/visualizations/graphviz/config/graphviz.xml
+++ b/config/plugins/visualizations/graphviz/config/graphviz.xml
@@ -4,7 +4,17 @@
Node Description
" + table); - for (var i = 0; i < fieldName.length; i++) { - if (isValidUrl(values[i])) { + for (var strIndex = 0; strIndex < fieldName.length; strIndex++) { + if (isValidUrl(values[strIndex])) { var e = document.createElement("div"); e.id = "linkDiv"; $('#nodeInfoDiv').append(e); - + var url = values[i]; - document.getElementById("linkDiv").innerHTML += "| " + fieldName[i] + " | " + "" + values[i] + " | " + "
| " + "degree" + " | " + "" + degree + " | " + "
| " + "number of child nodes" + " | " + "" + childNum + " | " + "
| " + "number of parent nodes" + " | " + "" + parentNum + " | " + "