281 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @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 );
 |