window.wp = window.wp || {}; window.eml = window.eml || { l10n: {} }; ( function( $, _ ) { var media = wp.media, l10n = media.view.l10n, l10n_defaults = { media_orderby: 'date', media_order: 'DESC' }, original = {}; _.extend( eml.l10n, wpuxss_eml_media_views_l10n ); _.defaults( eml.l10n, l10n_defaults ); /** * wp.media.controller.Library * */ original.controllerLibrary = { activate: media.controller.Library.prototype.activate }; _.extend( media.controller.Library.prototype, { activate: function() { original.controllerLibrary.activate.apply( this, arguments ); wp.Uploader.queue.on( 'add', this.beforeUpload, this ); wp.Uploader.queue.on( 'reset', this.afterUpload, this ); }, beforeUpload: function() { if ( wp.Uploader.queue.length == 1 ) { $('.attachment-filters:has(option[value!="all"]:selected)').val( 'all' ).change(); } }, afterUpload: function() { var library = this.get( 'library' ), selection = this.get( 'selection' ), orderby = library.props.get( 'orderby' ); if ( 'menuOrder' === orderby ) { library.saveMenuOrder(); } library.reset( library.models ); selection.trigger( 'selection:unsingle', selection.model, selection ); selection.trigger( 'selection:single', selection.model, selection ); }, uploading: function( attachment ) { var content = this.frame.content, selection = this.get( 'selection' ); if ( 'upload' === content.mode() ) { this.frame.content.mode('browse'); } if ( this.get( 'autoSelect' ) ) { if ( wp.Uploader.queue.length == 1 && selection.length ) { selection.reset(); } selection.add( attachment ); selection.trigger( 'selection:unsingle', selection.model, selection ); selection.trigger( 'selection:single', selection.model, selection ); } } }); /** * wp.media.view.AttachmentCompat * */ var newAttachmentCompatEvents = { 'click input' : 'preSave' }; _.extend( media.view.AttachmentCompat.prototype.events, newAttachmentCompatEvents ); _.extend( media.view.AttachmentCompat.prototype, { preSave: function() { this.noRender = true; media.model.Query.cleanQueries(); }, render: function() { var compat = this.model.get('compat'), $compat_el = this.$el, tcount = this.model.get('tcount'); _.each( tcount, function( count, term_id ) { var $option = $( '.eml-taxonomy-filters option[value="'+term_id+'"]' ), text = $option.text(); text = text.replace( /\(.*?\)/, '('+count+')' ); $option.text( text ); }); if ( ! compat || ! compat.item ) { return; } if ( this.noRender ) { return this; } this.views.detach(); this.$el.html( compat.item ); this.views.render(); // TODO: find a better solution if ( this.controller.isModeActive( 'select' ) && 'edit-attachment' != this.controller.state().get('id') ) { $.each( eml.l10n.compat_taxonomies_to_hide, function( id, taxonomy ) { $compat_el.find( '.compat-field-'+taxonomy ).remove(); }); } // TODO: find a better solution $.each( eml.l10n.compat_taxonomies, function( id, taxonomy ) { $compat_el.find( '.compat-field-'+taxonomy+' .label' ).addClass( 'eml-tax-label' ); $compat_el.find( '.compat-field-'+taxonomy+' .field' ).addClass( 'eml-tax-field' ); }); return this; } }); /** * wp.media.view.AttachmentFilters * */ _.extend( media.view.AttachmentFilters.prototype, { change: function() { var filter = this.filters[ this.el.value ], selection = this.controller.state().get( 'selection' ), resetFilterButton = this.controller.content.get().toolbar.get( 'resetFilterButton' ), all = $('.attachment-filters').length, unchanged = $('.attachment-filters').map(function(){ return this.value }).get().filter( function( val ){ return 'all' === val }).length; if ( filter ) { this.model.set( filter.props ); } if ( filter && selection && selection.length && wp.Uploader.queue.length !== 1 ) { selection.reset(); } if ( filter && media.view.settings.mediaTrash && ! _.isUndefined( this.controller.toolbar ) ) { this.controller.toolbar.get().$('.media-selection').toggleClass( 'trash', 'trash' === filter.props.status ); } if ( _.isUndefined( resetFilterButton ) ) { return; } resetFilterButton.model.set( 'disabled', all === unchanged ); }, select: function() { var model = this.model, value = 'all', props = model.toJSON(); props = _.omit( props, 'orderby', 'order' ); _.find( this.filters, function( filter, id ) { var filterProps = _.omit( filter.props, 'orderby', 'order' ); var equal = _.all( filterProps, function( prop, key ) { return prop === ( _.isUndefined( props[ key ] ) ? null : props[ key ] ); }); if ( equal ) { return value = id; } }); this.$el.val( value ); } }); /** * wp.media.view.AttachmentFilters * */ original.AttachmentFilters = { All: { createFilters: media.view.AttachmentFilters.All.prototype.createFilters }, Uploaded: { createFilters: media.view.AttachmentFilters.Uploaded.prototype.createFilters } }; /** * wp.media.view.AttachmentFilters.All * */ _.extend( media.view.AttachmentFilters.All.prototype, { createFilters: function() { var uncategorizedProps, taxonomies = _.intersection( _.keys( eml.l10n.taxonomies ), eml.l10n.filter_taxonomies ); original.AttachmentFilters.All.createFilters.apply( this, arguments ); _.each( this.filters, function( filter, key ) { filter.props['uncategorized'] = null; filter.props['orderby'] = eml.l10n.media_orderby; filter.props['order'] = eml.l10n.media_order; }); this.filters.uncategorized = { text: eml.l10n.uncategorized, props: { uploadedTo : null, uncategorized : true, status : null, type : null, orderby : eml.l10n.media_orderby, order : eml.l10n.media_order }, priority: 60 }; uncategorizedProps = this.filters.uncategorized.props; _.each( taxonomies, function( taxonomy ) { uncategorizedProps[taxonomy] = null; }); if ( media.view.settings.mediaTrash && ( this.controller.isModeActive( 'grid' ) || this.controller.isModeActive( 'eml-grid' ) ) ) { this.filters.trash = { text: l10n.trash, props: { uploadedTo : null, status : 'trash', type : null, orderby : 'date', order : 'DESC' }, priority: 70 }; } } }); /** * wp.media.view.AttachmentFilters.Uploaded * */ _.extend( media.view.AttachmentFilters.Uploaded.prototype, { createFilters: function() { var uncategorizedProps, taxonomies = _.intersection( _.keys( eml.l10n.taxonomies ), eml.l10n.filter_taxonomies ); original.AttachmentFilters.Uploaded.createFilters.apply( this, arguments ); _.each( this.filters, function( filter, key ) { filter.props['orderby'] = eml.l10n.media_orderby; filter.props['order'] = eml.l10n.media_order; }); } }); /** * wp.media.view.AttachmentFilters.Taxonomy * */ media.view.AttachmentFilters.Taxonomy = media.view.AttachmentFilters.extend({ id: function() { return 'media-attachment-'+this.options.taxonomy+'-filters'; }, className: function() { // TODO: get rid of excess class name that duplicates id return 'attachment-filters eml-taxonomy-filters attachment-'+this.options.taxonomy+'-filter'; }, createFilters: function() { var filters = {}, self = this; _.each( self.options.termList || {}, function( term, key ) { var term_id = term.term_id, term_name = $("
").html(term.term_name).text(); filters[ term_id ] = { text: term_name, props: { uncategorized : null, orderby : eml.l10n.media_orderby, order : eml.l10n.media_order }, priority: key+4 }; filters[term_id]['props'][self.options.taxonomy] = term_id; }); filters.all = { text: eml.l10n.filter_by + ' ' + self.options.singularName, props: { uncategorized : null, orderby : eml.l10n.media_orderby, order : eml.l10n.media_order }, priority: 1 }; filters['all']['props'][self.options.taxonomy] = null; filters.in = { text: '— ' + eml.l10n.in + ' ' + self.options.pluralName + ' —', props: { uncategorized : null, orderby : eml.l10n.media_orderby, order : eml.l10n.media_order }, priority: 2 }; filters['in']['props'][self.options.taxonomy] = 'in'; filters.not_in = { text: '— ' + eml.l10n.not_in + ' ' + self.options.singularName + ' —', props: { uncategorized : null, orderby : eml.l10n.media_orderby, order : eml.l10n.media_order }, priority: 3 }; filters['not_in']['props'][self.options.taxonomy] = 'not_in'; this.filters = filters; } }); /** * wp.media.view.AttachmentFilters.Authors * */ media.view.AttachmentFilters.Authors = media.view.AttachmentFilters.extend({ createFilters: function() { var filters = {}, self = this; _.each( self.options.users || {}, function( user, key ) { var user_id = user.user_id, user_name = user.user_name; filters[ user_id ] = { text: user_name, props: { author : user_id, orderby : eml.l10n.media_orderby, order : eml.l10n.media_order }, priority: key+2 }; }); filters.all = { text: eml.l10n.in + ' ' + eml.l10n.authors, props: { author : null, orderby : eml.l10n.media_orderby, order : eml.l10n.media_order }, priority: 1 }; this.filters = filters; } }); media.view.Button.resetFilters = media.view.Button.extend({ id: 'reset-all-filters', initialize: function() { media.view.Button.prototype.initialize.apply( this, arguments ); this.controller.on( 'select:activate select:deactivate', this.toogleResetFilters, this ); }, click: function( event ) { if ( '#' === this.attributes.href ) { event.preventDefault(); } $('.attachment-filters:has(option[value!="all"]:selected)').each( function( index ) { $(this).val( 'all' ).change(); }); }, toogleResetFilters: function() { this.$el.toggleClass( 'hidden' ); } }); media.view.Button.DeleteSelected = media.view.Button.extend({ initialize: function() { media.view.Button.prototype.initialize.apply( this, arguments ); if ( this.options.filters ) { this.options.filters.model.on( 'change', this.filterChange, this ); } this.controller.state().get( 'selection' ).on( 'add remove reset', this.toggleDisabled, this ); }, filterChange: function( model ) { if ( 'trash' === model.get( 'status' ) ) { this.model.set( 'text', l10n.untrashSelected ); } else if ( wp.media.view.settings.mediaTrash ) { this.model.set( 'text', l10n.trashSelected ); } else { this.model.set( 'text', l10n.deleteSelected ); } }, toggleDisabled: function() { this.model.set( 'disabled', ! this.controller.state().get( 'selection' ).length ); }, render: function() { media.view.Button.prototype.render.apply( this, arguments ); this.toggleDisabled(); return this; }, click: function() { var changed = [], removed = [], selection = this.controller.state().get( 'selection' ), library = this.controller.state().get( 'library' ); if ( ! selection.length ) { return; } if ( ! media.view.settings.mediaTrash && ! window.confirm( l10n.warnBulkDelete ) ) { return; } if ( media.view.settings.mediaTrash && 'trash' !== selection.at( 0 ).get( 'status' ) && ! window.confirm( l10n.warnBulkTrash ) ) { return; } selection.each( function( model ) { if ( ! model.get( 'nonces' )['delete'] ) { removed.push( model ); return; } if ( media.view.settings.mediaTrash && 'trash' === model.get( 'status' ) ) { model.set( 'status', 'inherit' ); changed.push( model.save() ); removed.push( model ); } else if ( media.view.settings.mediaTrash ) { model.set( 'status', 'trash' ); changed.push( model.save() ); removed.push( model ); } else { model.destroy({wait: true}); } } ); if ( changed.length ) { selection.remove( removed ); $.when.apply( null, changed ).then( _.bind( function() { library._requery( true ); this.controller.trigger( 'selection:action:done' ); }, this ) ); } else { this.controller.trigger( 'selection:action:done' ); } } }); media.view.Button.DeleteSelectedPermanently = media.view.Button.DeleteSelected.extend({ filterChange: function( model ) { this.canShow = ( 'trash' === model.get( 'status' ) ); this.$el.toggleClass( 'hidden', ! this.canShow ); this.controller.browserView.fixLayout(); }, render: function() { media.view.Button.prototype.render.apply( this, arguments ); this.$el.toggleClass( 'hidden', ! this.canShow ); return this; }, click: function() { var removed = [], selection = this.controller.state().get( 'selection' ), library = this.controller.state().get( 'library' ); if ( ! selection.length || ! window.confirm( l10n.warnBulkDelete ) ) { return; } selection.each( function( model ) { if ( ! model.get( 'nonces' )['delete'] ) { removed.push( model ); return; } model.destroy({wait: true}); } ); this.controller.trigger( 'selection:action:done' ); } }); media.view.Button.Deselect = media.view.Button.extend({ initialize: function() { media.view.Button.prototype.initialize.apply( this, arguments ); this.controller.state().get( 'selection' ).on( 'add remove reset', this.toggleDisabled, this ); }, toggleDisabled: function() { this.model.set( 'disabled', ! this.controller.state().get( 'selection' ).length ); }, click: function( event ) { event.preventDefault(); var selection = this.controller.state().get( 'selection' ); selection.reset(); // Keep focus inside media modal if ( this.controller.modal ) { this.controller.modal.focusManager.focus(); } } }); /** * wp.media.view.AttachmentsBrowser * */ original.AttachmentsBrowser = { initialize: media.view.AttachmentsBrowser.prototype.initialize, createToolbar: media.view.AttachmentsBrowser.prototype.createToolbar, }; _.extend( media.view.AttachmentsBrowser.prototype, { initialize: function() { original.AttachmentsBrowser.initialize.apply( this, arguments ); this.on( 'ready', this.fixLayout, this ); this.$window = $( window ); this.$window.on( 'resize', _.debounce( _.bind( this.fixLayout, this ), 15 ) ); if ( $('.notice-dismiss').length ) { $( document ).on( 'click', '.notice-dismiss', _.debounce( _.bind( this.fixLayout, this), 250 ) ); } }, fixLayout: function() { var $browser = this.$el, $attachments = $browser.find('.attachments'), $uploader = $browser.find('.uploader-inline'), $toolbar = $browser.find('.media-toolbar'), $messages = $('.eml-media-css .updated:visible, .eml-media-css .error:visible, .eml-media-css .notice:visible, .eml-media-css .notice-error:visible, .eml-media-css .notice-warning:visible, .eml-media-css .notice-success:visible, .eml-media-css .notice-info:visible'), $update_nag = $('.eml-media-css .update-nag'); if ( $update_nag.length ) { $update_nag.css( 'margin-left', 15 + 'px' ); $browser.closest('.wrap').css( 'top', $update_nag.outerHeight() + 25 + 'px' ); } if ( ! this.controller.isModeActive( 'select' ) && ! this.controller.isModeActive( 'eml-grid' ) ) { return; } if ( this.controller.isModeActive( 'select' ) ) { $attachments.css( 'top', $toolbar.height() + 10 + 'px' ); $uploader.css( 'top', $toolbar.height() + 10 + 'px' ); $browser.find('.eml-loader').css( 'top', $toolbar.height() + 10 + 'px' ); // TODO: find a better place for it, something like fixLayoutOnce $toolbar.find('.media-toolbar-secondary').prepend( $toolbar.find('.instructions') ); } if ( this.controller.isModeActive( 'eml-grid' ) ) { var messagesOuterHeight = 0; if ( ! _.isUndefined( $messages ) ) { $messages.each( function() { messagesOuterHeight += $(this).outerHeight( true ); }); messagesOuterHeight = messagesOuterHeight ? messagesOuterHeight - 15 : 0; } $browser.css( 'top', $toolbar.outerHeight() + messagesOuterHeight + 15 + 'px' ); $toolbar.css( 'top', - $toolbar.outerHeight() - 25 + 'px' ); } }, createToolbar: function() { var LibraryViewSwitcher, Filters, toolbarOptions, self = this, i = 1, isResetButton = false; toolbarOptions = { controller: this.controller }; if ( this.controller.isModeActive( 'grid' ) || this.controller.isModeActive( 'eml-grid' ) ) { toolbarOptions.className = 'media-toolbar wp-filter'; } /** * @member {wp.media.view.Toolbar} */ this.toolbar = new media.view.Toolbar( toolbarOptions ); this.views.add( this.toolbar ); this.toolbar.set( 'spinner', new media.view.Spinner({ priority: -40 }) ); if ( this.controller.isModeActive( 'grid' ) || this.controller.isModeActive( 'eml-grid' ) ) { LibraryViewSwitcher = media.View.extend({ className: 'view-switch media-grid-view-switch', template: media.template( 'media-library-view-switcher') }); this.toolbar.set( 'libraryViewSwitcher', new LibraryViewSwitcher({ controller: this.controller, priority: -90 }).render() ); } if ( -1 !== $.inArray( this.options.filters, [ 'uploaded', 'all' ] ) || ( parseInt( eml.l10n.force_filters ) && ! this.controller.isModeActive( 'eml-bulk-edit' ) && 'gallery-edit' !== this.controller._state && 'playlist-edit' !== this.controller._state && 'video-playlist-edit' !== this.controller._state ) || 'customize' === eml.l10n.current_screen || 'widgets' === eml.l10n.current_screen ) { if ( -1 !== $.inArray( 'types', eml.l10n.filters_to_show ) ) { this.toolbar.set( 'filtersLabel', new media.view.Label({ value: l10n.filterByType, attributes: { 'for': 'media-attachment-filters' }, priority: -80 }).render() ); if ( 'uploaded' === this.options.filters ) { this.toolbar.set( 'filters', new media.view.AttachmentFilters.Uploaded({ controller: this.controller, model: this.collection.props, priority: -80 }).render() ); } else { Filters = new media.view.AttachmentFilters.All({ controller: this.controller, model: this.collection.props, priority: -80 }); this.toolbar.set( 'filters', Filters.render() ); } } if ( eml.l10n.wp_version >= '4.0' && -1 !== $.inArray( 'dates', eml.l10n.filters_to_show ) && media.view.settings.months.length ) { this.toolbar.set( 'dateFilterLabel', new media.view.Label({ value: l10n.filterByDate, attributes: { 'for': 'media-attachment-date-filters' }, priority: -75 }).render() ); this.toolbar.set( 'dateFilter', new media.view.DateFilter({ controller: this.controller, model: this.collection.props, priority: -75 }).render() ); } if ( eml.l10n.users.length > 1 && -1 !== $.inArray( 'authors', eml.l10n.filters_to_show ) ) { this.toolbar.set( 'authorFilterLabel', new media.view.Label({ value: eml.l10n.filter_by + ' ' + eml.l10n.author, attributes: { 'for': 'author-filter', }, priority: -70 + i++ }).render() ); this.toolbar.set( 'author-filter', new media.view.AttachmentFilters.Authors({ controller: this.controller, model: this.collection.props, priority: -70 + i++, users: eml.l10n.users, }).render() ); } if ( -1 !== $.inArray( 'taxonomies', eml.l10n.filters_to_show ) ) { $.each( eml.l10n.taxonomies, function( taxonomy, values ) { if ( -1 !== _.indexOf( eml.l10n.filter_taxonomies, taxonomy ) && values.term_list.length ) { self.toolbar.set( taxonomy+'FilterLabel', new media.view.Label({ value: eml.l10n.filter_by + values.singular_name, attributes: { 'for': 'media-attachment-' + taxonomy + '-filters', }, priority: -70 + i++ }).render() ); self.toolbar.set( taxonomy+'-filter', new media.view.AttachmentFilters.Taxonomy({ controller: self.controller, model: self.collection.props, priority: -70 + i++, taxonomy: taxonomy, termList: values.term_list, singularName: values.singular_name, pluralName: values.plural_name }).render() ); } }); } if ( this.toolbar.$el.find('.attachment-filters').length > 1 ) { this.toolbar.set( 'resetFilterButton', new media.view.Button.resetFilters({ controller: this.controller, text: eml.l10n.reset_filters, disabled: true, priority: -70 + i++ }).render() ); } } // endif if ( this.controller.isModeActive( 'eml-grid' ) ) { this.toolbar.set( 'deselectButton', new media.view.Button.Deselect ({ controller: this.controller, text: l10n.cancelSelection, disabled: true, priority: -70 + i++ }).render() ); this.toolbar.set( 'emlDeleteSelectedButton', new media.view.Button.DeleteSelected({ filters: Filters, style: 'primary', // className: 'delete-selected-button', disabled: true, text: media.view.settings.mediaTrash ? l10n.trashSelected : l10n.deleteSelected, controller: this.controller, priority: -70 + i++ }).render() ); if ( media.view.settings.mediaTrash ) { this.toolbar.set( 'emlDeleteSelectedPermanentlyButton', new media.view.Button.DeleteSelectedPermanently({ filters: Filters, style: 'primary', disabled: true, text: l10n.deleteSelected, controller: this.controller, priority: -55 }).render() ); } } // in case it is not eml-grid but the original grid somewhere if ( this.controller.isModeActive( 'grid' ) ) { // BulkSelection is a