WordPress.org

Make WordPress Core

Ticket #22593: 22593.diff

File 22593.diff, 5.7 KB (added by koopersmith, 17 months ago)
  • wp-includes/js/media-views.js

     
    814814                                selector = ''; 
    815815                        } 
    816816 
     817                        views = views || []; 
     818 
    817819                        if ( existing = this.get( selector ) ) { 
    818820                                views = _.isArray( views ) ? views : [ views ]; 
    819821                                this._views[ selector ] = views.length ? _.difference( existing, views ) : []; 
    820822                        } 
    821823 
    822824                        if ( ! options || ! options.silent ) 
    823                                 _.invoke( views, 'dispose', { silent: true }); 
     825                                _.invoke( views, 'dispose' ); 
    824826 
    825827                        return this; 
    826828                }, 
     
    10141016                render: function() { 
    10151017                        var options; 
    10161018 
     1019                        if ( this.prepare ) 
     1020                                options = this.prepare(); 
     1021 
    10171022                        this.views.detach(); 
    10181023 
    10191024                        if ( this.template ) { 
    1020                                 options = this.prepare ? this.prepare() : {}; 
     1025                                options = options || {}; 
    10211026                                this.trigger( 'prepare', options ); 
    10221027                                this.$el.html( this.template( options ) ); 
    10231028                        } 
     
    24332438                        this.details( this.model, this.controller.state().get('selection') ); 
    24342439                }, 
    24352440 
    2436                 destroy: function() { 
    2437                         this.model.off( null, null, this ); 
    2438                         this.remove(); 
     2441                dispose: function() { 
     2442                        this.updateAll(); 
     2443                        media.View.prototype.dispose.apply( this, arguments ); 
     2444                        return this; 
    24392445                }, 
    24402446 
    24412447                render: function() { 
     
    24622468                        if ( 'image' === options.type ) 
    24632469                                options.size = this.imageSize(); 
    24642470 
     2471                        this.views.detach(); 
    24652472                        this.$el.html( this.template( options ) ); 
    24662473 
    24672474                        this.$el.toggleClass( 'uploading', options.uploading ); 
     
    24742481                        if ( this.selected() ) 
    24752482                                this.select(); 
    24762483 
     2484                        this.views.render(); 
    24772485                        return this; 
    24782486                }, 
    24792487 
     
    25712579                        this.model.save( $setting.data('setting'), event.target.value ); 
    25722580                }, 
    25732581 
     2582                updateAll: function() { 
     2583                        var $settings = this.$('[data-setting]'), 
     2584                                model = this.model, 
     2585                                changed; 
     2586 
     2587                        model.set( _.chain( $settings ).map( function( el ) { 
     2588                                var $input = $('input, textarea, select, [value]', el ); 
     2589 
     2590                                if ( $input.length ) 
     2591                                        return [ $(el).data('setting'), $input.val() ]; 
     2592                        }).compact().object().value(), { silent: true } ); 
     2593 
     2594                        if ( changed = model.changedAttributes() ) 
     2595                                model.save( changed ); 
     2596                }, 
     2597 
    25742598                removeFromLibrary: function( event ) { 
    25752599                        // Stop propagation so the model isn't selected. 
    25762600                        event.stopPropagation(); 
     
    26142638        media.view.Attachments = media.View.extend({ 
    26152639                tagName:   'ul', 
    26162640                className: 'attachments', 
    2617                 template:  media.template('attachments-css'), 
    26182641 
     2642                cssTemplate: media.template('attachments-css'), 
     2643 
    26192644                events: { 
    26202645                        'scroll': 'scroll' 
    26212646                }, 
     
    26312656                                sortable:           false 
    26322657                        }); 
    26332658 
    2634                         _.each(['add','remove'], function( method ) { 
    2635                                 this.collection.on( method, function( attachment, attachments, options ) { 
    2636                                         this[ method ]( attachment, options.index ); 
    2637                                 }, this ); 
     2659                        this._viewsByCid = {}; 
     2660 
     2661                        this.collection.on( 'add', function( attachment, attachments, options ) { 
     2662                                this.views.add( this.createAttachmentView( attachment ), { 
     2663                                        at: options.index 
     2664                                }); 
    26382665                        }, this ); 
    26392666 
     2667                        this.collection.on( 'remove', function( attachment, attachments, options ) { 
     2668                                var view = this._viewsByCid[ attachment.cid ]; 
     2669                                delete this._viewsByCid[ attachment.cid ]; 
     2670 
     2671                                if ( view ) 
     2672                                        view.remove(); 
     2673                        }, this ); 
     2674 
    26402675                        this.collection.on( 'reset', this.render, this ); 
    26412676 
    26422677                        // Throttle the scroll handler. 
     
    26642699                        if ( $css.length ) 
    26652700                                $css.remove(); 
    26662701 
    2667                         media.view.Attachments.$head().append( this.template({ 
     2702                        media.view.Attachments.$head().append( this.cssTemplate({ 
    26682703                                id:     this.el.id, 
    26692704                                edge:   this.edge(), 
    26702705                                gutter: this.model.get('gutter') 
     
    27392774                        this.$el.sortable( 'option', 'disabled', !! this.collection.comparator ); 
    27402775                }, 
    27412776 
    2742                 render: function() { 
    2743                         // If there are no elements, load some. 
    2744                         if ( ! this.collection.length ) { 
    2745                                 this.collection.more().done( this.scroll ); 
    2746                                 this.$el.empty(); 
    2747                                 return this; 
    2748                         } 
     2777                createAttachmentView: function( attachment ) { 
     2778                        var view = new this.options.AttachmentView({ 
     2779                                controller: this.controller, 
     2780                                model:      attachment, 
     2781                                collection: this.collection, 
     2782                                selection:  this.options.selection 
     2783                        }); 
    27492784 
    2750                         // Otherwise, create all of the Attachment views, and replace 
     2785                        return this._viewsByCid[ attachment.cid ] = view; 
     2786                }, 
     2787 
     2788                prepare: function() { 
     2789                        // Create all of the Attachment views, and replace 
    27512790                        // the list in a single DOM operation. 
    2752                         this.$el.html( this.collection.map( function( attachment ) { 
    2753                                 return new this.options.AttachmentView({ 
    2754                                         controller: this.controller, 
    2755                                         model:      attachment, 
    2756                                         collection: this.collection, 
    2757                                         selection:  this.options.selection 
    2758                                 }).render().$el; 
    2759                         }, this ) ); 
     2791                        if ( this.collection.length ) { 
     2792                                this.views.set( this.collection.map( this.createAttachmentView, this ) ); 
    27602793 
    2761                         return this; 
     2794                        // If there are no elements, clear the views and load some. 
     2795                        } else { 
     2796                                this.views.unset(); 
     2797                                this.collection.more().done( this.scroll ); 
     2798                        } 
    27622799                }, 
    27632800 
    27642801                ready: function() { 
     
    27672804                        this.scroll(); 
    27682805                }, 
    27692806 
    2770                 add: function( attachment, index ) { 
    2771                         var view, children; 
    2772  
    2773                         view = new this.options.AttachmentView({ 
    2774                                 controller: this.controller, 
    2775                                 model:      attachment, 
    2776                                 collection: this.collection, 
    2777                                 selection:  this.options.selection 
    2778                         }).render(); 
    2779  
    2780                         children = this.$el.children(); 
    2781  
    2782                         if ( children.length > index ) 
    2783                                 children.eq( index ).before( view.$el ); 
    2784                         else 
    2785                                 this.$el.append( view.$el ); 
    2786                 }, 
    2787  
    2788                 remove: function( attachment, index ) { 
    2789                         var children = this.$el.children(); 
    2790                         if ( children.length ) 
    2791                                 children.eq( index ).detach(); 
    2792                 }, 
    2793  
    27942807                scroll: function( event ) { 
    27952808                        // @todo: is this still necessary? 
    27962809                        if ( ! this.$el.is(':visible') )