diff --git a/client/galaxy/scripts/mvc/collection/list-collection-creator.js b/client/galaxy/scripts/mvc/collection/list-collection-creator.js index 33c69e46743..4f04ae04f80 100644 --- a/client/galaxy/scripts/mvc/collection/list-collection-creator.js +++ b/client/galaxy/scripts/mvc/collection/list-collection-creator.js @@ -57,14 +57,19 @@ var DatasetCollectionElementView = Backbone.View.extend( BASE_MVC.LoggableMixin var view = this, parentWidth = this.$el.parent().width(); this.$el.animate({ 'margin-right' : parentWidth }, 'fast', function(){ - view.off(); - view.$el.remove(); + view.destroy(); view.trigger( 'discard', { source : view }); }); }, + /** remove the DOM and any listeners */ + destroy : function(){ + this.off(); + this.$el.remove(); + }, + events : { 'click' : '_click', 'click .name' : '_clickName', @@ -133,8 +138,10 @@ var DatasetCollectionElementView = Backbone.View.extend( BASE_MVC.LoggableMixin */ var ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({ + /** the class used to display individual elements */ + elementViewClass : DatasetCollectionElementView, /** the class this creator will create and save */ - collectionClass : HDCA.HistoryListDatasetCollection, + collectionClass : HDCA.HistoryListDatasetCollection, className : 'list-collection-creator collection-creator flex-row-container', defaultAttributes : { @@ -195,7 +202,7 @@ var ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).exten this._ensureElementIds(); this._validateElements(); this._mangleDuplicateNames(); - // this._sortElements(); + this._sortElements(); }, /** add ids to dataset objs in initial list if none */ @@ -265,16 +272,18 @@ var ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).exten /** sort a list of elements */ _sortElements : function( list ){ - // currently only natural sort by name - this.workingElements.sort( function( a, b ){ return naturalSort( a.name, b.name ); }); - return this.workingElements; + // // currently only natural sort by name + // this.workingElements.sort( function( a, b ){ return naturalSort( a.name, b.name ); }); + // return this.workingElements; }, // ------------------------------------------------------------------------ rendering + // templates : ListCollectionCreator.templates, + /** render the entire interface */ render : function( speed, callback ){ //this.debug( '-- _render' ); - this.$el.empty().html( ListCollectionCreator.templates.main() ); + this.$el.empty().html( this.templates.main() ); this._renderHeader( speed ); this._renderMiddle( speed ); this._renderFooter( speed ); @@ -286,8 +295,8 @@ var ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).exten /** render the header section */ _renderHeader : function( speed, callback ){ - var $header = this.$( '.header' ).empty().html( ListCollectionCreator.templates.header() ) - .find( '.help-content' ).prepend( $( ListCollectionCreator.templates.helpContent() ) ); + var $header = this.$( '.header' ).empty().html( this.templates.header() ) + .find( '.help-content' ).prepend( $( this.templates.helpContent() ) ); //TODO: should only show once despite calling _renderHeader again if( this.invalidElements.length ){ this._invalidElementsAlert(); @@ -297,14 +306,14 @@ var ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).exten /** render the middle including the elements */ _renderMiddle : function( speed, callback ){ - var $middle = this.$( '.middle' ).empty().html( ListCollectionCreator.templates.middle() ); + var $middle = this.$( '.middle' ).empty().html( this.templates.middle() ); this._renderList( speed ); return $middle; }, /** render the footer, completion controls, and cancel controls */ _renderFooter : function( speed, callback ){ - var $footer = this.$( '.footer' ).empty().html( ListCollectionCreator.templates.footer() ); + var $footer = this.$( '.footer' ).empty().html( this.templates.footer() ); if( typeof this.oncancel === 'function' ){ this.$( '.cancel-create.btn' ).show(); } @@ -361,15 +370,20 @@ var ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).exten /** render the elements in order (or a warning if no elements found) */ _renderList : function( speed, callback ){ + //this.debug( '-- _renderList' ); + var creator = this, + $tmp = jQuery( '
' ); + + _.each( this.elementViews, function( view ){ + view.destroy(); + creator.removeElementView( view ); + }); + if( !this.workingElements.length ){ this._renderNoValidElements(); return; } - //this.debug( '-- _renderList' ); - var creator = this, - $tmp = jQuery( '
' ); - creator.workingElements.forEach( function( element ){ var elementView = creator._createElementView( element ); $tmp.append( elementView.$el ); @@ -382,7 +396,7 @@ var ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).exten /** create an element view, cache in elementViews, set up listeners, and return */ _createElementView : function( element ){ - var elementView = new DatasetCollectionElementView({ + var elementView = new this.elementViewClass({ //TODO: use non-generic class or not all // model : COLLECTION.DatasetDCE( element ) element : element, @@ -441,7 +455,7 @@ var ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).exten /** render a message in the list that no valid elements were found to create a collection */ _renderNoValidElements : function(){ - this.$( '.collection-elements' ).append( ListCollectionCreator.templates.noValidElements() ); + this.$( '.collection-elements' ).append( this.templates.noValidElements() ); }, // ------------------------------------------------------------------------ API @@ -758,140 +772,140 @@ var ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).exten } }, + // ------------------------------------------------------------------------ templates + //TODO: move to require text plugin and load these as text + //TODO: underscore currently unnecc. bc no vars are used + //TODO: better way of localizing text-nodes in long strings + /** underscore template fns attached to class */ + templates : { + /** the skeleton */ + main : _.template([ + '
', + '
', + '