(function($){ /* * Image * * static model for this field * * @type event * @date 1/06/13 * */ // reference var _media = acf.media; acf.fields.image = { $el : null, $input : null, o : {}, set : function( o ){ // merge in new option $.extend( this, o ); // find input this.$input = this.$el.find('input[type="hidden"]'); // get options this.o = acf.helpers.get_atts( this.$el ); // multiple? this.o.multiple = this.$el.closest('.repeater').exists() ? true : false; // wp library query this.o.query = { type : 'image' }; // library if( this.o.library == 'uploadedTo' ) { this.o.query.uploadedTo = acf.o.post_id; } // return this for chaining return this; }, init : function(){ // is clone field? if( acf.helpers.is_clone_field(this.$input) ) { return; } }, add : function( image ){ // this function must reference a global div variable due to the pre WP 3.5 uploader // vars var div = _media.div; // set atts div.find('.acf-image-image').attr( 'src', image.url ); div.find('.acf-image-value').val( image.id ).trigger('change'); // set div class div.addClass('active'); // validation div.closest('.field').removeClass('error'); }, new_frame: function( attributes ){ // set global var _media.div = this.$el; // clear the frame _media.clear_frame(); // vars attributes.states = []; // append states attributes.states.push( new wp.media.controller.Library({ library : wp.media.query( this.o.query ), multiple : attributes.multiple, title : attributes.title, priority : 20, filterable : 'all' }) ); // edit image functionality (added in WP 3.9) if( acf.helpers.isset(wp, 'media', 'controller', 'EditImage') ) { attributes.states.push( new wp.media.controller.EditImage() ); } // Create the media frame _media.frame = wp.media( attributes ); // edit image view // source: media-views.js:2410 editImageContent() _media.frame.on('content:render:edit-image', function(){ var image = this.state().get('image'), view = new wp.media.view.EditImage( { model: image, controller: this } ).render(); this.content.set( view ); // after creating the wrapper view, load the actual editor via an ajax call view.loadEditor(); }, _media.frame); // update toolbar button _media.frame.on( 'toolbar:create:select', function( toolbar ) { toolbar.view = new wp.media.view.Toolbar.Select({ text: attributes.button.text, controller: this }); }, _media.frame ); // return return _media.frame; }, edit : function(){ // vars var id = this.$input.val(); // create frame this.new_frame({ title : acf.l10n.image.edit, multiple : false, button : { text : acf.l10n.image.update } }); // open _media.frame.on('open',function() { // set to browse if( _media.frame.content._mode != 'browse' ) { _media.frame.content.mode('browse'); } // add class _media.frame.$el.closest('.media-modal').addClass('acf-media-modal acf-expanded'); // set selection var selection = _media.frame.state().get('selection'), attachment = wp.media.attachment( id ); // to fetch or not to fetch if( $.isEmptyObject(attachment.changed) ) { attachment.fetch(); } selection.add( attachment ); }); // close _media.frame.on('close',function(){ // remove class _media.frame.$el.closest('.media-modal').removeClass('acf-media-modal'); }); // Finally, open the modal _media.frame.open(); }, remove : function() { // set atts this.$el.find('.acf-image-image').attr( 'src', '' ); this.$el.find('.acf-image-value').val( '' ).trigger('change'); // remove class this.$el.removeClass('active'); }, popup : function() { // reference var t = this; // create frame this.new_frame({ title : acf.l10n.image.select, multiple : t.o.multiple, button : { text : acf.l10n.image.select } }); // customize model / view _media.frame.on('content:activate', function(){ // vars var toolbar = null, filters = null; // populate above vars making sure to allow for failure try { toolbar = acf.media.frame.content.get().toolbar; filters = toolbar.get('filters'); } catch(e) { // one of the objects was 'undefined'... perhaps the frame open is Upload Files //console.log( e ); } // validate if( !filters ) { return false; } // filter only images $.each( filters.filters, function( k, v ){ v.props.type = 'image'; }); // no need for 'uploaded' filter if( t.o.library == 'uploadedTo' ) { filters.$el.find('option[value="uploaded"]').remove(); filters.$el.after('' + acf.l10n.image.uploadedTo + '') $.each( filters.filters, function( k, v ){ v.props.uploadedTo = acf.o.post_id; }); } // remove non image options from filter list filters.$el.find('option').each(function(){ // vars var v = $(this).attr('value'); // don't remove the 'uploadedTo' if the library option is 'all' if( v == 'uploaded' && t.o.library == 'all' ) { return; } if( v.indexOf('image') === -1 ) { $(this).remove(); } }); // set default filter filters.$el.val('image').trigger('change'); }); // When an image is selected, run a callback. acf.media.frame.on( 'select', function() { // get selected images selection = _media.frame.state().get('selection'); if( selection ) { var i = 0; selection.each(function(attachment){ // counter i++; // select / add another image field? if( i > 1 ) { // vars var $td = _media.div.closest('td'), $tr = $td.closest('.row'), $repeater = $tr.closest('.repeater'), key = $td.attr('data-field_key'), selector = 'td .acf-image-uploader:first'; // key only exists for repeater v1.0.1 + if( key ) { selector = 'td[data-field_key="' + key + '"] .acf-image-uploader'; } // add row? if( ! $tr.next('.row').exists() ) { $repeater.find('.add-row-end').trigger('click'); } // update current div _media.div = $tr.next('.row').find( selector ); } // vars var image = { id : attachment.id, url : attachment.attributes.url }; // is preview size available? if( attachment.attributes.sizes && attachment.attributes.sizes[ t.o.preview_size ] ) { image.url = attachment.attributes.sizes[ t.o.preview_size ].url; } // add image to field acf.fields.image.add( image ); }); // selection.each(function(attachment){ } // if( selection ) }); // acf.media.frame.on( 'select', function() { // Finally, open the modal acf.media.frame.open(); return false; }, // temporary gallery fix text : { title_add : "Select Image", title_edit : "Edit Image" } }; /* * Events * * jQuery events for this field * * @type function * @date 1/03/2011 * * @param N/A * @return N/A */ $(document).on('click', '.acf-image-uploader .acf-button-edit', function( e ){ e.preventDefault(); acf.fields.image.set({ $el : $(this).closest('.acf-image-uploader') }).edit(); }); $(document).on('click', '.acf-image-uploader .acf-button-delete', function( e ){ e.preventDefault(); acf.fields.image.set({ $el : $(this).closest('.acf-image-uploader') }).remove(); }); $(document).on('click', '.acf-image-uploader .add-image', function( e ){ e.preventDefault(); acf.fields.image.set({ $el : $(this).closest('.acf-image-uploader') }).popup(); }); })(jQuery);