var View = wp.media.View, UploaderStatus; /** * wp.media.view.UploaderStatus * * An uploader status for on-going uploads. * * @memberOf wp.media.view * * @class * @augments wp.media.View * @augments wp.Backbone.View * @augments Backbone.View */ UploaderStatus = View.extend(/** @lends wp.media.view.UploaderStatus.prototype */{ className: 'media-uploader-status', template: wp.template('uploader-status'), events: { 'click .upload-dismiss-errors': 'dismiss' }, initialize: function() { this.queue = wp.Uploader.queue; this.queue.on( 'add remove reset', this.visibility, this ); this.queue.on( 'add remove reset change:percent', this.progress, this ); this.queue.on( 'add remove reset change:uploading', this.info, this ); this.errors = wp.Uploader.errors; this.errors.reset(); this.errors.on( 'add remove reset', this.visibility, this ); this.errors.on( 'add', this.error, this ); }, /** * @return {wp.media.view.UploaderStatus} */ dispose: function() { wp.Uploader.queue.off( null, null, this ); /** * call 'dispose' directly on the parent class */ View.prototype.dispose.apply( this, arguments ); return this; }, visibility: function() { this.$el.toggleClass( 'uploading', !! this.queue.length ); this.$el.toggleClass( 'errors', !! this.errors.length ); this.$el.toggle( !! this.queue.length || !! this.errors.length ); }, ready: function() { _.each({ '$bar': '.media-progress-bar div', '$index': '.upload-index', '$total': '.upload-total', '$filename': '.upload-filename' }, function( selector, key ) { this[ key ] = this.$( selector ); }, this ); this.visibility(); this.progress(); this.info(); }, progress: function() { var queue = this.queue, $bar = this.$bar; if ( ! $bar || ! queue.length ) { return; } $bar.width( ( queue.reduce( function( memo, attachment ) { if ( ! attachment.get('uploading') ) { return memo + 100; } var percent = attachment.get('percent'); return memo + ( _.isNumber( percent ) ? percent : 100 ); }, 0 ) / queue.length ) + '%' ); }, info: function() { var queue = this.queue, index = 0, active; if ( ! queue.length ) { return; } active = this.queue.find( function( attachment, i ) { index = i; return attachment.get('uploading'); }); this.$index.text( index + 1 ); this.$total.text( queue.length ); this.$filename.html( active ? this.filename( active.get('filename') ) : '' ); }, /** * @param {string} filename * @return {string} */ filename: function( filename ) { return _.escape( filename ); }, /** * @param {Backbone.Model} error */ error: function( error ) { var statusError = new wp.media.view.UploaderStatusError( { filename: this.filename( error.get( 'file' ).name ), message: error.get( 'message' ) } ); // Can show additional info here while retrying to create image sub-sizes. this.views.add( '.upload-errors', statusError, { at: 0 } ); }, dismiss: function() { var errors = this.views.get('.upload-errors'); if ( errors ) { _.invoke( errors, 'remove' ); } wp.Uploader.errors.reset(); // Move focus to the modal after the dismiss button gets removed from the DOM. if ( this.controller.modal ) { this.controller.modal.focusManager.focus(); } } }); module.exports = UploaderStatus;