Skip to content
Snippets Groups Projects
Select Git revision
  • 445bf898d2015d1e28e5f01ef07b26be9dd42bf1
  • master default protected
  • better-queue
3 results

tables10.0.0.go

Blame
  • customize-models.js 6.66 KiB
    /**
     * @output wp-includes/js/customize-models.js
     */
    
    /* global _wpCustomizeHeader */
    (function( $, wp ) {
    	var api = wp.customize;
    	/** @namespace wp.customize.HeaderTool */
    	api.HeaderTool = {};
    
    
    	/**
    	 * wp.customize.HeaderTool.ImageModel
    	 *
    	 * A header image. This is where saves via the Customizer API are
    	 * abstracted away, plus our own AJAX calls to add images to and remove
    	 * images from the user's recently uploaded images setting on the server.
    	 * These calls are made regardless of whether the user actually saves new
    	 * Customizer settings.
    	 *
    	 * @memberOf wp.customize.HeaderTool
    	 * @alias wp.customize.HeaderTool.ImageModel
    	 *
    	 * @constructor
    	 * @augments Backbone.Model
    	 */
    	api.HeaderTool.ImageModel = Backbone.Model.extend(/** @lends wp.customize.HeaderTool.ImageModel.prototype */{
    		defaults: function() {
    			return {
    				header: {
    					attachment_id: 0,
    					url: '',
    					timestamp: _.now(),
    					thumbnail_url: ''
    				},
    				choice: '',
    				selected: false,
    				random: false
    			};
    		},
    
    		initialize: function() {
    			this.on('hide', this.hide, this);
    		},
    
    		hide: function() {
    			this.set('choice', '');
    			api('header_image').set('remove-header');
    			api('header_image_data').set('remove-header');
    		},
    
    		destroy: function() {
    			var data = this.get('header'),
    				curr = api.HeaderTool.currentHeader.get('header').attachment_id;
    
    			// If the image we're removing is also the current header,
    			// unset the latter.
    			if (curr && data.attachment_id === curr) {
    				api.HeaderTool.currentHeader.trigger('hide');
    			}
    
    			wp.ajax.post( 'custom-header-remove', {
    				nonce: _wpCustomizeHeader.nonces.remove,
    				wp_customize: 'on',
    				theme: api.settings.theme.stylesheet,
    				attachment_id: data.attachment_id
    			});
    
    			this.trigger('destroy', this, this.collection);
    		},
    
    		save: function() {
    			if (this.get('random')) {
    				api('header_image').set(this.get('header').random);
    				api('header_image_data').set(this.get('header').random);
    			} else {
    				if (this.get('header').defaultName) {
    					api('header_image').set(this.get('header').url);
    					api('header_image_data').set(this.get('header').defaultName);
    				} else {
    					api('header_image').set(this.get('header').url);
    					api('header_image_data').set(this.get('header'));
    				}
    			}
    
    			api.HeaderTool.combinedList.trigger('control:setImage', this);
    		},
    
    		importImage: function() {
    			var data = this.get('header');
    			if (data.attachment_id === undefined) {
    				return;
    			}
    
    			wp.ajax.post( 'custom-header-add', {
    				nonce: _wpCustomizeHeader.nonces.add,
    				wp_customize: 'on',
    				theme: api.settings.theme.stylesheet,
    				attachment_id: data.attachment_id
    			} );
    		},
    
    		shouldBeCropped: function() {
    			if (this.get('themeFlexWidth') === true &&
    						this.get('themeFlexHeight') === true) {
    				return false;
    			}
    
    			if (this.get('themeFlexWidth') === true &&
    				this.get('themeHeight') === this.get('imageHeight')) {
    				return false;
    			}
    
    			if (this.get('themeFlexHeight') === true &&
    				this.get('themeWidth') === this.get('imageWidth')) {
    				return false;
    			}
    
    			if (this.get('themeWidth') === this.get('imageWidth') &&
    				this.get('themeHeight') === this.get('imageHeight')) {
    				return false;
    			}
    
    			if (this.get('imageWidth') <= this.get('themeWidth')) {
    				return false;
    			}
    
    			return true;
    		}
    	});
    
    
    	/**
    	 * wp.customize.HeaderTool.ChoiceList
    	 *
    	 * @memberOf wp.customize.HeaderTool
    	 * @alias wp.customize.HeaderTool.ChoiceList
    	 *
    	 * @constructor
    	 * @augments Backbone.Collection
    	 */
    	api.HeaderTool.ChoiceList = Backbone.Collection.extend({
    		model: api.HeaderTool.ImageModel,
    
    		// Ordered from most recently used to least.
    		comparator: function(model) {
    			return -model.get('header').timestamp;
    		},
    
    		initialize: function() {
    			var current = api.HeaderTool.currentHeader.get('choice').replace(/^https?:\/\//, ''),
    				isRandom = this.isRandomChoice(api.get().header_image);
    
    			// Overridable by an extending class.
    			if (!this.type) {
    				this.type = 'uploaded';
    			}
    
    			// Overridable by an extending class.
    			if (typeof this.data === 'undefined') {
    				this.data = _wpCustomizeHeader.uploads;
    			}
    
    			if (isRandom) {
    				// So that when adding data we don't hide regular images.
    				current = api.get().header_image;
    			}
    
    			this.on('control:setImage', this.setImage, this);
    			this.on('control:removeImage', this.removeImage, this);
    			this.on('add', this.maybeRemoveOldCrop, this);
    			this.on('add', this.maybeAddRandomChoice, this);
    
    			_.each(this.data, function(elt, index) {
    				if (!elt.attachment_id) {
    					elt.defaultName = index;
    				}
    
    				if (typeof elt.timestamp === 'undefined') {
    					elt.timestamp = 0;
    				}
    
    				this.add({
    					header: elt,
    					choice: elt.url.split('/').pop(),
    					selected: current === elt.url.replace(/^https?:\/\//, '')
    				}, { silent: true });
    			}, this);
    
    			if (this.size() > 0) {
    				this.addRandomChoice(current);
    			}
    		},
    
    		maybeRemoveOldCrop: function( model ) {
    			var newID = model.get( 'header' ).attachment_id || false,
    			 	oldCrop;
    
    			// Bail early if we don't have a new attachment ID.
    			if ( ! newID ) {
    				return;
    			}
    
    			oldCrop = this.find( function( item ) {
    				return ( item.cid !== model.cid && item.get( 'header' ).attachment_id === newID );
    			} );
    
    			// If we found an old crop, remove it from the collection.
    			if ( oldCrop ) {
    				this.remove( oldCrop );
    			}
    		},
    
    		maybeAddRandomChoice: function() {
    			if (this.size() === 1) {
    				this.addRandomChoice();
    			}
    		},
    
    		addRandomChoice: function(initialChoice) {
    			var isRandomSameType = RegExp(this.type).test(initialChoice),
    				randomChoice = 'random-' + this.type + '-image';
    
    			this.add({
    				header: {
    					timestamp: 0,
    					random: randomChoice,
    					width: 245,
    					height: 41
    				},
    				choice: randomChoice,
    				random: true,
    				selected: isRandomSameType
    			});
    		},
    
    		isRandomChoice: function(choice) {
    			return (/^random-(uploaded|default)-image$/).test(choice);
    		},
    
    		shouldHideTitle: function() {
    			return this.size() < 2;
    		},
    
    		setImage: function(model) {
    			this.each(function(m) {
    				m.set('selected', false);
    			});
    
    			if (model) {
    				model.set('selected', true);
    			}
    		},
    
    		removeImage: function() {
    			this.each(function(m) {
    				m.set('selected', false);
    			});
    		}
    	});
    
    
    	/**
    	 * wp.customize.HeaderTool.DefaultsList
    	 *
    	 * @memberOf wp.customize.HeaderTool
    	 * @alias wp.customize.HeaderTool.DefaultsList
    	 *
    	 * @constructor
    	 * @augments wp.customize.HeaderTool.ChoiceList
    	 * @augments Backbone.Collection
    	 */
    	api.HeaderTool.DefaultsList = api.HeaderTool.ChoiceList.extend({
    		initialize: function() {
    			this.type = 'default';
    			this.data = _wpCustomizeHeader.defaults;
    			api.HeaderTool.ChoiceList.prototype.initialize.apply(this);
    		}
    	});
    
    })( jQuery, window.wp );