WordPress.org

Make WordPress Core

Ticket #22593: 22593.2.diff

File 22593.2.diff, 5.9 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                        changed = _.chain( $settings ).map( function( el ) {
     2588                                var $input = $('input, textarea, select, [value]', el ),
     2589                                        setting, value;
     2590
     2591                                if ( ! $input.length )
     2592                                        return;
     2593
     2594                                setting = $(el).data('setting');
     2595                                value = $input.val();
     2596
     2597                                // Record the value if it changed.
     2598                                if ( model.get( setting ) !== value )
     2599                                        return [ setting, value ];
     2600                        }).compact().object().value();
     2601
     2602                        if ( changed )
     2603                                model.save( changed );
     2604                },
     2605
    25742606                removeFromLibrary: function( event ) {
    25752607                        // Stop propagation so the model isn't selected.
    25762608                        event.stopPropagation();
     
    26142646        media.view.Attachments = media.View.extend({
    26152647                tagName:   'ul',
    26162648                className: 'attachments',
    2617                 template:  media.template('attachments-css'),
    26182649
     2650                cssTemplate: media.template('attachments-css'),
     2651
    26192652                events: {
    26202653                        'scroll': 'scroll'
    26212654                },
     
    26312664                                sortable:           false
    26322665                        });
    26332666
    2634                         _.each(['add','remove'], function( method ) {
    2635                                 this.collection.on( method, function( attachment, attachments, options ) {
    2636                                         this[ method ]( attachment, options.index );
    2637                                 }, this );
     2667                        this._viewsByCid = {};
     2668
     2669                        this.collection.on( 'add', function( attachment, attachments, options ) {
     2670                                this.views.add( this.createAttachmentView( attachment ), {
     2671                                        at: options.index
     2672                                });
    26382673                        }, this );
    26392674
     2675                        this.collection.on( 'remove', function( attachment, attachments, options ) {
     2676                                var view = this._viewsByCid[ attachment.cid ];
     2677                                delete this._viewsByCid[ attachment.cid ];
     2678
     2679                                if ( view )
     2680                                        view.remove();
     2681                        }, this );
     2682
    26402683                        this.collection.on( 'reset', this.render, this );
    26412684
    26422685                        // Throttle the scroll handler.
     
    26642707                        if ( $css.length )
    26652708                                $css.remove();
    26662709
    2667                         media.view.Attachments.$head().append( this.template({
     2710                        media.view.Attachments.$head().append( this.cssTemplate({
    26682711                                id:     this.el.id,
    26692712                                edge:   this.edge(),
    26702713                                gutter: this.model.get('gutter')
     
    27392782                        this.$el.sortable( 'option', 'disabled', !! this.collection.comparator );
    27402783                },
    27412784
    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                         }
     2785                createAttachmentView: function( attachment ) {
     2786                        var view = new this.options.AttachmentView({
     2787                                controller: this.controller,
     2788                                model:      attachment,
     2789                                collection: this.collection,
     2790                                selection:  this.options.selection
     2791                        });
    27492792
    2750                         // Otherwise, create all of the Attachment views, and replace
     2793                        return this._viewsByCid[ attachment.cid ] = view;
     2794                },
     2795
     2796                prepare: function() {
     2797                        // Create all of the Attachment views, and replace
    27512798                        // 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 ) );
     2799                        if ( this.collection.length ) {
     2800                                this.views.set( this.collection.map( this.createAttachmentView, this ) );
    27602801
    2761                         return this;
     2802                        // If there are no elements, clear the views and load some.
     2803                        } else {
     2804                                this.views.unset();
     2805                                this.collection.more().done( this.scroll );
     2806                        }
    27622807                },
    27632808
    27642809                ready: function() {
     
    27672812                        this.scroll();
    27682813                },
    27692814
    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 
    27942815                scroll: function( event ) {
    27952816                        // @todo: is this still necessary?
    27962817                        if ( ! this.$el.is(':visible') )