WordPress.org

Make WordPress Core

Ticket #22725: 22725.diff

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

     
    367367                        contentUserSetting: true, 
    368368 
    369369                        // Sync the selection from the last state when 'multiple' matches. 
    370                         syncLastSelection: true 
     370                        syncSelection: true 
    371371                }, 
    372372 
    373373                initialize: function() { 
    374                         if ( ! this.get('selection') ) { 
     374                        var selection = this.get('selection'), 
     375                                props; 
     376 
     377                        // If a library isn't provided, query all media items. 
     378                        if ( ! this.get('library') ) 
     379                                this.set( 'library', media.query() ); 
     380 
     381                        // If a selection instance isn't provided, create one. 
     382                        if ( ! (selection instanceof media.model.Selection) ) { 
     383                                props = selection; 
     384 
     385                                if ( ! props ) { 
     386                                        props = this.get('library').props.toJSON(); 
     387                                        props = _.omit( props, 'orderby', 'query' ); 
     388                                } 
     389 
     390                                // If the `selection` attribute is set to an object, 
     391                                // it will use those values as the selection instance's 
     392                                // `props` model. Otherwise, it will copy the library's 
     393                                // `props` model. 
    375394                                this.set( 'selection', new media.model.Selection( null, { 
    376                                         multiple: this.get('multiple') 
     395                                        multiple: this.get('multiple'), 
     396                                        props: props 
    377397                                }) ); 
    378398                        } 
    379399 
    380                         if ( ! this.get('library') ) 
    381                                 this.set( 'library', media.query() ); 
    382  
    383400                        if ( ! this.get('edge') ) 
    384401                                this.set( 'edge', 120 ); 
    385402 
     
    390407                }, 
    391408 
    392409                activate: function() { 
    393                         if ( this.get('syncLastSelection') ) 
    394                                 this.getLastSelection(); 
     410                        this.syncSelection(); 
    395411 
    396412                        wp.Uploader.queue.on( 'add', this.uploading, this ); 
    397413 
     
    406422                }, 
    407423 
    408424                deactivate: function() { 
     425                        this.recordSelection(); 
     426 
    409427                        this.frame.off( 'content:activate', this.saveContentMode, this ); 
    410428 
    411429                        // Unbind all event handlers that use this state as the context 
     
    455473                        setUserSetting( 'urlbutton', display.link ); 
    456474                }, 
    457475 
    458                 getLastSelection: function() { 
     476                syncSelection: function() { 
    459477                        var selection = this.get('selection'), 
    460                                 lastState = this.frame.lastState(), 
    461                                 lastSelection = lastState && lastState.get('selection'), 
    462                                 lastMultiple, thisMultiple; 
     478                                manager = this.frame._selection; 
    463479 
    464                         if ( ! lastSelection ) 
     480                        if ( ! this.get('syncSelection') || ! manager || ! selection ) 
    465481                                return; 
    466482 
    467                         // We don't care about the method of multiple selection the 
    468                         // selections use, just that they both support (or don't support) 
    469                         // multiple selection. 
    470                         lastMultiple = !! lastSelection.multiple; 
    471                         thisMultiple = !! selection.multiple; 
     483                        // If the selection supports multiple items, validate the stored 
     484                        // attachments based on the new selection's conditions. Record 
     485                        // the attachments that are not included; we'll maintain a 
     486                        // reference to those. Other attachments are considered in flux. 
     487                        if ( selection.multiple ) { 
     488                                selection.reset( [], { silent: true }); 
     489                                selection.validateAll( manager.attachments ); 
     490                                manager.difference = _.difference( manager.attachments.models, selection.models ); 
     491                        } 
    472492 
    473                         if ( lastMultiple !== thisMultiple ) 
     493                        // Sync the selection's single item with the master. 
     494                        selection.single( manager.single ); 
     495                }, 
     496 
     497                recordSelection: function() { 
     498                        var selection = this.get('selection'), 
     499                                manager = this.frame._selection, 
     500                                filtered; 
     501 
     502                        if ( ! this.get('syncSelection') || ! manager || ! selection ) 
    474503                                return; 
    475504 
    476                         selection.reset( lastSelection.toArray() ).single( lastSelection.single() ); 
     505                        // Record the currently active attachments, which is a combination 
     506                        // of the selection's attachments and the set of selected 
     507                        // attachments that this specific selection considered invalid. 
     508                        // Reset the difference and record the single attachment. 
     509                        if ( selection.multiple ) { 
     510                                manager.attachments.reset( selection.toArray().concat( manager.difference ) ); 
     511                                manager.difference = []; 
     512                        } else { 
     513                                manager.attachments.add( selection.toArray() ); 
     514                        } 
     515 
     516                        manager.single = selection._single; 
    477517                }, 
    478518 
    479519                refreshContent: function() { 
     
    527567                        content:    'browse', 
    528568                        title:      l10n.editGalleryTitle, 
    529569                        priority:   60, 
    530                         dragInfo:   true 
     570                        dragInfo:   true, 
     571 
     572                        // Don't sync the selection, as the Edit Gallery library 
     573                        // *is* the selection. 
     574                        syncSelection: false 
    531575                }, 
    532576 
    533577                initialize: function() { 
     
    601645                        menu:         'gallery', 
    602646                        toolbar:      'gallery-add', 
    603647                        title:        l10n.addToGalleryTitle, 
    604                         priority:     100 
     648                        priority:     100, 
     649 
     650                        // Don't sync the selection, as the Edit Gallery library 
     651                        // *is* the selection. 
     652                        syncSelection: false 
    605653                }, media.controller.Library.prototype.defaults ), 
    606654 
    607655                initialize: function() { 
     
    641689                        multiple:   false, 
    642690                        toolbar:    'featured-image', 
    643691                        title:      l10n.setFeaturedImageTitle, 
    644                         priority:   60 
     692                        priority:   60, 
     693 
     694                        syncSelection: false 
    645695                }, media.controller.Library.prototype.defaults ), 
    646696 
    647697                initialize: function() { 
     
    14291479                                        multiple: this.options.multiple 
    14301480                                }); 
    14311481                        } 
     1482 
     1483                        this._selection = { 
     1484                                attachments: new Attachments(), 
     1485                                difference: [] 
     1486                        }; 
    14321487                }, 
    14331488 
    14341489                createStates: function() { 
     
    14411496                        this.states.add([ 
    14421497                                // Main states. 
    14431498                                new media.controller.Library({ 
    1444                                         selection: options.selection, 
    14451499                                        library:   media.query( options.library ), 
    14461500                                        multiple:  options.multiple, 
    14471501                                        title:     options.title, 
     
    15261580                }, 
    15271581 
    15281582                createStates: function() { 
    1529                         var options = this.options, 
    1530                                 selection = options.selection; 
     1583                        var options = this.options; 
    15311584 
    15321585                        // Add the default states. 
    15331586                        this.states.add([ 
     
    15391592                                        toolbar:    'main-insert', 
    15401593                                        filterable: 'all', 
    15411594                                        library:    media.query( options.library ), 
    1542                                         selection:  selection, 
    15431595                                        multiple:   options.multiple ? 'reset' : false, 
    15441596                                        editable:   true, 
    15451597 
     
    15651617 
    15661618                                        library:  media.query( _.defaults({ 
    15671619                                                type: 'image' 
    1568                                         }, options.library ) ), 
    1569  
    1570                                         selection: new media.model.Selection( selection.models, { 
    1571                                                 multiple: 'add' 
    1572                                         }) 
     1620                                        }, options.library ) ) 
    15731621                                }), 
    15741622 
    15751623                                // Embed states.