Make WordPress Core

Changeset 22477


Ignore:
Timestamp:
11/09/2012 01:23:20 AM (14 years ago)
Author:
koopersmith
Message:

Media JS: Add JIT composite library creation/destruction to states to allow for dynamically excluded Attachment models. see #21390.

Location:
trunk/wp-includes/js
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/js/media-models.js

    r22467 r22477  
    742742                observe: function( attachments, options ) {
    743743                        var silent = options && options.silent;
     744                        this.observers = this.observers || [];
     745                        this.observers.push( attachments );
    744746
    745747                        attachments.on( 'add remove',  silent ? this._evaluateSilentHandler : this._evaluateHandler, this );
     
    747749
    748750                        this.evaluateAll( attachments, options );
     751                        return this;
    749752                },
    750753
    751754                unobserve: function( attachments ) {
    752                         attachments.off( 'add remove', this._evaluateHandler, this );
    753                         attachments.off( 'reset', this._evaluateAllHandler, this );
     755                        if ( attachments ) {
     756                                attachments.off( null, null, this );
     757                                this.observers = _.without( this.observers, attachments );
     758
     759                        } else {
     760                                _.each( this.observers, function( attachments ) {
     761                                        attachments.off( null, null, this );
     762                                }, this );
     763                                delete this.observers;
     764                        }
     765
     766                        return this;
    754767                },
    755768
  • trunk/wp-includes/js/media-views.js

    r22467 r22477  
    292292                        var selection = this.get('selection');
    293293
     294                        this._excludeStateLibrary();
     295                        this.buildComposite();
     296                        this.on( 'change:library change:exclude', this.buildComposite, this );
     297                        this.on( 'change:excludeState', this._excludeState, this );
     298
    294299                        // If we're in a workflow that supports multiple attachments,
    295300                        // automatically select any uploading attachments.
     
    307312
    308313                deactivate: function() {
     314                        this.off( 'change:library change:exclude', this.buildComposite, this );
     315                        this.off( 'change:excludeState', this._excludeState, this );
     316                        this.destroyComposite();
     317
    309318                        wp.Uploader.queue.off( 'add', this.selectUpload, this );
    310319
     
    376385
    377386                        return this;
     387                },
     388
     389                buildComposite: function() {
     390                        var original = this.get('_library'),
     391                                exclude = this.get('exclude'),
     392                                composite;
     393
     394                        this.destroyComposite();
     395                        if ( ! this.get('exclude') )
     396                                return;
     397
     398                        // Remember the state's original library.
     399                        if ( ! original )
     400                                this.set( '_library', original = this.get('library') );
     401
     402                        // Create a composite library in its place.
     403                        composite = new media.model.Composite( null, {
     404                                props: _.pick( original.props.toJSON(), 'order', 'orderby' )
     405                        });
     406
     407                        // Accepts attachments that exist in the original library and
     408                        // that do not exist in the excluded library.
     409                        composite.validator = function( attachment ) {
     410                                return !! original.getByCid( attachment.cid ) && ! exclude.getByCid( attachment.cid );
     411                        };
     412
     413                        composite.observe( original ).observe( exclude );
     414
     415                        // When `more()` is triggered on the composite collection,
     416                        // pass the command over to the `original`, which will
     417                        // populate the query.
     418                        composite.more = _.bind( original.more, original );
     419
     420                        this.set( 'library', composite );
     421                },
     422
     423                destroyComposite: function() {
     424                        var composite = this.get('library'),
     425                                original = this.get('_library');
     426
     427                        if ( ! original )
     428                                return;
     429
     430                        composite.unobserve();
     431                        this.set( 'library', original );
     432                        this.unset('_library');
     433                },
     434
     435                _excludeState: function() {
     436                        var current = this.get('excludeState'),
     437                                previous = this.previous('excludeState');
     438
     439                        if ( previous )
     440                                this.frame.get( previous ).off( 'change:library', this._excludeStateLibrary, this );
     441
     442                        if ( current )
     443                                this.frame.get( previous ).on( 'change:library', this._excludeStateLibrary, this );
     444                },
     445
     446                _excludeStateLibrary: function() {
     447                        var current = this.get('excludeState');
     448
     449                        if ( ! current )
     450                                return;
     451
     452                        this.set( 'exclude', this.frame.get( current ).get('library') );
    378453                }
    379454        });
     
    660735                                new media.controller.Library( _.defaults({
    661736                                        id:      'gallery-library',
    662                                         library: media.query({ type: 'image' })
     737                                        library: media.query({ type: 'image' }),
     738                                        excludeState: 'gallery-edit'
    663739                                }, gallery ) ),
    664740
    665741                                new media.controller.Upload( _.defaults({
    666                                         id: 'gallery-upload'
     742                                        id: 'gallery-upload',
     743                                        excludeState: 'gallery-edit'
    667744                                }, gallery ) )
    668745                        ]);
    669746
    670                         this.get('gallery-edit').on( 'change:library', this.updateGalleryLibraries, this ).set({
    671                                 library: options.selection
    672                         });
    673 
    674747                        // Set the default state.
    675748                        this.state( options.state );
    676                 },
    677 
    678                 updateGalleryLibraries: function() {
    679                         var editLibrary = this.get('gallery-edit').get('library');
    680 
    681                         _.each(['gallery-library','gallery-upload'], function( id ) {
    682                                 var state = this.get( id ),
    683                                         original = state.get('_library'),
    684                                         composite;
    685 
    686                                 // Remember the state's original library.
    687                                 if ( ! original )
    688                                         state.set( '_library', original = state.get('library') );
    689 
    690                                 // Create a composite library in its place.
    691                                 composite = new media.model.Composite( null, {
    692                                         props: _.pick( original.props.toJSON(), 'order', 'orderby' )
    693                                 });
    694 
    695                                 // Accepts attachments that exist in the original library and
    696                                 // that do not exist in the state's library.
    697                                 composite.validator = function( attachment ) {
    698                                         return !! original.getByCid( attachment.cid ) && ! editLibrary.getByCid( attachment.cid );
    699                                 };
    700 
    701                                 composite.observe( original );
    702                                 composite.observe( editLibrary );
    703 
    704                                 // When `more()` is triggered on the composite collection,
    705                                 // pass the command over to the `original`, which will
    706                                 // populate the query.
    707                                 composite.more = _.bind( original.more, original );
    708 
    709                                 state.set( 'library', composite );
    710                         }, this );
    711749                },
    712750
Note: See TracChangeset for help on using the changeset viewer.