/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 11);
/************************************************************************/
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(12);
/***/ (function(module, exports, __webpack_require__) {
* @output wp-includes/js/media-grid.js
media.controller.EditAttachmentMetadata = __webpack_require__( 13 );
media.view.MediaFrame.Manage = __webpack_require__( 14 );
media.view.Attachment.Details.TwoColumn = __webpack_require__( 15 );
media.view.MediaFrame.Manage.Router = __webpack_require__( 16 );
media.view.EditImage.Details = __webpack_require__( 17 );
media.view.MediaFrame.EditAttachments = __webpack_require__( 18 );
media.view.SelectModeToggleButton = __webpack_require__( 19 );
media.view.DeleteSelectedButton = __webpack_require__( 20 );
media.view.DeleteSelectedPermanentlyButton = __webpack_require__( 21 );
/***/ (function(module, exports) {
var l10n = wp.media.view.l10n,
* wp.media.controller.EditAttachmentMetadata
* A state for editing an attachment's metadata.
* @memberOf wp.media.controller
* @augments wp.media.controller.State
* @augments Backbone.Model
EditAttachmentMetadata = wp.media.controller.State.extend(/** @lends wp.media.controller.EditAttachmentMetadata.prototype */{
// Title string passed to the frame's title region view.
title: l10n.attachmentDetails,
content: 'edit-metadata',
module.exports = EditAttachmentMetadata;
/***/ (function(module, exports) {
var MediaFrame = wp.media.view.MediaFrame,
Library = wp.media.controller.Library,
* wp.media.view.MediaFrame.Manage
* A generic management frame workflow.
* Used in the media grid view.
* @memberOf wp.media.view.MediaFrame
* @augments wp.media.view.MediaFrame
* @augments wp.media.view.Frame
* @augments wp.media.View
* @augments wp.Backbone.View
* @augments Backbone.View
* @mixes wp.media.controller.StateMachine
Manage = MediaFrame.extend(/** @lends wp.media.view.MediaFrame.Manage.prototype */{
_.defaults( this.options, {
library: {}, // Options hash for the query to the media library.
this.$body = $( document.body );
this.$window = $( window );
this.$adminBar = $( '#wpadminbar' );
// Store the Add New button for later reuse in wp.media.view.UploaderInline.
this.$uploaderToggler = $( '.page-title-action' )
.attr( 'aria-expanded', 'false' )
.on( 'click', _.bind( this.addNewClickHandler, this ) );
this.$window.on( 'scroll resize', _.debounce( _.bind( this.fixPosition, this ), 15 ) );
// 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({
$('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 );
this.bindRegionModeHandlers();
this.bindSearchHandler();
wp.media.frames.browse = this;
bindSearchHandler: function() {
var search = this.$( '#media-search-input' ),
searchView = this.browserView.toolbar.get( 'search' ).$el,
listMode = this.$( '.view-list' ),
input = _.throttle( function (e) {
var val = $( e.currentTarget ).val(),
this.gridRouter.navigate( this.gridRouter.baseUrl( url ), { replace: true } );
// Update the URL when entering search string (at most once per second).
search.on( 'input', _.bind( input, this ) );
.on( 'route:search', function () {
var href = window.location.href;
if ( href.indexOf( 'mode=' ) > -1 ) {
href = href.replace( /mode=[^&]+/g, 'mode=list' );
href += href.indexOf( '?' ) > -1 ? '&mode=list' : '?mode=list';
href = href.replace( 'search=', 's=' );
listMode.prop( 'href', href );
.on( 'route:reset', function() {
searchView.val( '' ).trigger( 'input' );
* Create the default states for the frame.
createStates: function() {
var options = this.options;
if ( this.options.states ) {
// Add the default states.
library: wp.media.query( options.library ),
multiple: options.multiple,
contentUserSetting: false,
* Bind region mode activation events to proper handlers.
bindRegionModeHandlers: function() {
this.on( 'content:create:browse', this.browseContent, this );
// Handle a frame-level event for editing an attachment.
this.on( 'edit:attachment', this.openEditAttachmentModal, this );
this.on( 'select:activate', this.bindKeydown, this );
this.on( 'select:deactivate', this.unbindKeydown, this );
handleKeydown: function( e ) {
this.deactivateMode( 'select' ).activateMode( 'edit' );
bindKeydown: function() {
this.$body.on( 'keydown.select', _.bind( this.handleKeydown, this ) );
unbindKeydown: function() {
this.$body.off( 'keydown.select' );
fixPosition: function() {
if ( ! this.isModeActive( 'select' ) ) {
$browser = this.$('.attachments-browser');
$toolbar = $browser.find('.media-toolbar');
// 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');
$browser.removeClass( 'fixed' );
$toolbar.css('width', '');
* Click handler for the `Add New` button.
addNewClickHandler: function( event ) {
this.trigger( 'toggle:upload:attachment' );
* 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 );
wp.media.frames.edit = wp.media( {
frame: 'edit-attachments',
library: this.state().get('library'),
* 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();
// Browse our library of attachments.
this.browserView = contentRegion.view = new wp.media.view.AttachmentsBrowser({
collection: state.get('library'),
selection: state.get('selection'),
sortable: state.get('sortable'),
search: state.get('searchable'),
filters: state.get('filterable'),
display: state.get('displaySettings'),
dragInfo: state.get('dragInfo'),
suggestedWidth: state.get('suggestedWidth'),
suggestedHeight: state.get('suggestedHeight'),
AttachmentView: state.get('AttachmentView'),
this.browserView.on( 'ready', _.bind( this.bindDeferred, this ) );
this.errors = wp.Uploader.errors;
this.errors.on( 'add remove reset', this.sidebarVisibility, this );
sidebarVisibility: function() {
this.browserView.$( '.media-sidebar' ).toggle( !! this.errors.length );
bindDeferred: function() {
if ( ! this.browserView.dfd ) {
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.start( {
root: window._wpMediaGridSettings.adminUrl,
/***/ (function(module, exports) {
var Details = wp.media.view.Attachment.Details,
* 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
* @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.TowColumn.prototype */{
template: wp.template( 'attachment-details-two-column' ),
this.controller.on( 'content:activate:edit-details', _.bind( this.editAttachment, this ) );
Details.prototype.initialize.apply( this, arguments );
editAttachment: function( event ) {
this.controller.content.mode( 'edit-image' );
* Noop this from parent class, doesn't apply here.
toggleSelectionHandler: function() {}
module.exports = TwoColumn;