WordPress.org

Make WordPress Core

Ticket #22593: 22593.diff

File 22593.diff, 5.7 KB (added by koopersmith, 5 years 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') )