var l10n = wp.media.view.l10n, EditAttachmentMetadata;
/** * wp.media.controller.EditAttachmentMetadata * * A state for editing an attachment's metadata. * * @memberOf wp.media.controller * * @class * @augments wp.media.controller.State * @augments Backbone.Model */ EditAttachmentMetadata = wp.media.controller.State.extend(/** @lends wp.media.controller.EditAttachmentMetadata.prototype */{ defaults: { id: 'edit-attachment', // Title string passed to the frame's title region view. title: l10n.attachmentDetails, // Region mode defaults. content: 'edit-metadata', menu: false, toolbar: false, router: false } });
module.exports = EditAttachmentMetadata;
/***/ }),
/***/ 2429: /***/ ((module) => {
/** * wp.media.view.MediaFrame.Manage.Router * * A router for handling the browser history and application state. * * @memberOf wp.media.view.MediaFrame.Manage * * @class * @augments Backbone.Router */ var Router = Backbone.Router.extend(/** @lends wp.media.view.MediaFrame.Manage.Router.prototype */{ routes: { 'upload.php?item=:slug&mode=edit': 'editItem', 'upload.php?item=:slug': 'showItem', 'upload.php?search=:query': 'search', 'upload.php': 'reset' },
// Map routes against the page URL. baseUrl: function( url ) { return 'upload.php' + url; },
reset: function() { var frame = wp.media.frames.edit;
if ( frame ) { frame.close(); } },
// Respond to the search route by filling the search field and triggering the input event. search: function( query ) { jQuery( '#media-search-input' ).val( query ).trigger( 'input' ); },
// Show the modal with a specific item. showItem: function( query ) { var media = wp.media, frame = media.frames.browse, library = frame.state().get('library'), item;
// Trigger the media frame to open the correct item. item = library.findWhere( { id: parseInt( query, 10 ) } );
// Show the modal in edit mode with a specific item. editItem: function( query ) { this.showItem( query ); wp.media.frames.edit.content.mode( 'edit-details' ); } });
module.exports = Router;
/***/ }),
/***/ 1312: /***/ ((module) => {
var Details = wp.media.view.Attachment.Details, TwoColumn;
/** * wp.media.view.Attachment.Details.TwoColumn * * A similar view to media.view.Attachment.Details * for use in the Edit Attachment modal. * * @memberOf wp.media.view.Attachment.Details * * @class * @augments wp.media.view.Attachment.Details * @augments wp.media.view.Attachment * @augments wp.media.View * @augments wp.Backbone.View * @augments Backbone.View */ TwoColumn = Details.extend(/** @lends wp.media.view.Attachment.Details.TwoColumn.prototype */{ template: wp.template( 'attachment-details-two-column' ),
initialize: function() { this.controller.on( 'content:activate:edit-details', _.bind( this.editAttachment, this ) );
var Frame = wp.media.view.Frame, MediaFrame = wp.media.view.MediaFrame,
$ = jQuery, EditAttachments;
/** * wp.media.view.MediaFrame.EditAttachments * * A frame for editing the details of a specific media item. * * Opens in a modal by default. * * Requires an attachment model to be passed in the options hash under `model`. * * @memberOf wp.media.view.MediaFrame * * @class * @augments wp.media.view.Frame * @augments wp.media.View * @augments wp.Backbone.View * @augments Backbone.View * @mixes wp.media.controller.StateMachine */ EditAttachments = MediaFrame.extend(/** @lends wp.media.view.MediaFrame.EditAttachments.prototype */{
bindHandlers: function() { // Bind default title creation. this.on( 'title:create:default', this.createTitle, this );
this.on( 'content:create:edit-metadata', this.editMetadataMode, this ); this.on( 'content:create:edit-image', this.editImageMode, this ); this.on( 'content:render:edit-image', this.editImageModeRender, this ); this.on( 'refresh', this.rerender, this ); this.on( 'close', this.detach );
this.bindModelHandlers(); this.listenTo( this.gridRouter, 'route:search', this.close, this ); },
bindModelHandlers: function() { // Close the modal if the attachment is deleted. this.listenTo( this.model, 'change:status destroy', this.close, this ); },
this.modal.on( 'open', _.bind( function () { $( 'body' ).on( 'keydown.media-modal', _.bind( this.keyEvent, this ) ); }, this ) );
// Completely destroy the modal DOM element when closing it. this.modal.on( 'close', _.bind( function() { // Remove the keydown event. $( 'body' ).off( 'keydown.media-modal' ); // Move focus back to the original item in the grid if possible. $( 'li.attachment[data-id="' + this.model.get( 'id' ) +'"]' ).trigger( 'focus' ); this.resetRoute(); }, this ) );
// Set this frame as the modal's content. this.modal.content( this ); this.modal.open(); } },
/** * Add the default states to the frame. */ createStates: function() { this.states.add([ new wp.media.controller.EditAttachmentMetadata({ model: this.model, library: this.library }) ]); },
/** * Content region rendering callback for the `edit-metadata` mode. * * @param {Object} contentRegion Basic object with a `view` property, which * should be set with the proper region view. */ editMetadataMode: function( contentRegion ) { contentRegion.view = new wp.media.view.Attachment.Details.TwoColumn({ controller: this, model: this.model });
/** * Attach a subview to display fields added via the * `attachment_fields_to_edit` filter. */ contentRegion.view.views.set( '.attachment-compat', new wp.media.view.AttachmentCompat({ controller: this, model: this.model }) );
// Update browser url when navigating media details, except on load. if ( this.model && ! this.model.get( 'skipHistory' ) ) { this.gridRouter.navigate( this.gridRouter.baseUrl( '?item=' + this.model.id ) ); } },
/** * Render the EditImage view into the frame's content region. * * @param {Object} contentRegion Basic object with a `view` property, which * should be set with the proper region view. */ editImageMode: function( contentRegion ) { var editImageController = new wp.media.controller.EditImage( { model: this.model, frame: this } ); // Noop some methods. editImageController._toolbar = function() {}; editImageController._router = function() {}; editImageController._menu = function() {};
/** * Rerender the view. */ rerender: function( model ) { this.stopListening( this.model );
this.model = model;
this.bindModelHandlers();
// Only rerender the `content` region. if ( this.content.mode() !== 'edit-metadata' ) { this.content.mode( 'edit-metadata' ); } else { this.content.render(); }
this.toggleNav(); },
/** * Click handler to switch to the previous media item. */ previousMediaItem: function() { if ( ! this.hasPrevious() ) { return; }
this.trigger( 'refresh', this.library.at( this.getCurrentIndex() - 1 ) ); // Move focus to the Previous button. When there are no more items, to the Next button. this.focusNavButton( this.hasPrevious() ? '.left' : '.right' ); },
/** * Click handler to switch to the next media item. */ nextMediaItem: function() { if ( ! this.hasNext() ) { return; }
this.trigger( 'refresh', this.library.at( this.getCurrentIndex() + 1 ) ); // Move focus to the Next button. When there are no more items, to the Previous button. this.focusNavButton( this.hasNext() ? '.right' : '.left' ); },
/** * Set focus to the navigation buttons depending on the browsing direction. * * @since 5.3.0 * * @param {string} which A CSS selector to target the button to focus. */ focusNavButton: function( which ) { $( which ).trigger( 'focus' ); },
hasPrevious: function() { return ( this.getCurrentIndex() - 1 ) > -1; }, /** * Respond to the keyboard events: right arrow, left arrow, except when * focus is in a textarea or input field. */ keyEvent: function( event ) { if ( ( 'INPUT' === event.target.nodeName || 'TEXTAREA' === event.target.nodeName ) && ! event.target.disabled ) { return; }
// The right arrow key. if ( 39 === event.keyCode ) { this.nextMediaItem(); } // The left arrow key. if ( 37 === event.keyCode ) { this.previousMediaItem(); } },
// Ensure core and media grid view UI is enabled. this.$el.addClass('wp-core-ui');
// Force the uploader off if the upload limit has been exceeded or // if the browser isn't supported. if ( wp.Uploader.limitExceeded || ! wp.Uploader.browser.supported ) { this.options.uploader = false; }
// Initialize a window-wide uploader. if ( this.options.uploader ) { this.uploader = new wp.media.view.UploaderWindow({ controller: this, uploader: { dropzone: document.body, container: document.body } }).render(); this.uploader.ready(); $('body').append( this.uploader.el );
this.options.uploader = false; }
this.gridRouter = new wp.media.view.MediaFrame.Manage.Router();
// Call 'initialize' directly on the parent class. MediaFrame.prototype.initialize.apply( this, arguments );
// Append the frame view directly the supplied container. this.$el.appendTo( this.options.container );
// Offset doesn't appear to take top margin into account, hence +16. if ( ( $browser.offset().top + 16 ) < this.$window.scrollTop() + this.$adminBar.height() ) { $browser.addClass( 'fixed' ); $toolbar.css('width', $browser.width() + 'px'); } else { $browser.removeClass( 'fixed' ); $toolbar.css('width', ''); } },
/** * Click handler for the `Add New` button. */ addNewClickHandler: function( event ) { event.preventDefault(); this.trigger( 'toggle:upload:attachment' );
if ( this.uploader ) { this.uploader.refresh(); } },
/** * Open the Edit Attachment modal. */ openEditAttachmentModal: function( model ) { // Create a new EditAttachment frame, passing along the library and the attachment model. if ( wp.media.frames.edit ) { wp.media.frames.edit.open().trigger( 'refresh', model ); } else { wp.media.frames.edit = wp.media( { frame: 'edit-attachments', controller: this, library: this.state().get('library'), model: model } ); } },
/** * Create an attachments browser view within the content region. * * @param {Object} contentRegion Basic object with a `view` property, which * should be set with the proper region view. * @this wp.media.controller.Region */ browseContent: function( contentRegion ) { var state = this.state();
bindDeferred: function() { if ( ! this.browserView.dfd ) { return; } this.browserView.dfd.done( _.bind( this.startHistory, this ) ); },
startHistory: function() { // Verify pushState support and activate. if ( window.history && window.history.pushState ) { if ( Backbone.History.started ) { Backbone.history.stop(); } Backbone.history.start( { root: window._wpMediaGridSettings.adminUrl, pushState: true } ); } } });
module.exports = Manage;
/***/ })
/******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. (() => { /** * @output wp-includes/js/media-grid.js */