angelovcom.net

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

customize-models.js (6821B)


      1 /**
      2  * @output wp-includes/js/customize-models.js
      3  */
      4 
      5 /* global _wpCustomizeHeader */
      6 (function( $, wp ) {
      7 	var api = wp.customize;
      8 	/** @namespace wp.customize.HeaderTool */
      9 	api.HeaderTool = {};
     10 
     11 
     12 	/**
     13 	 * wp.customize.HeaderTool.ImageModel
     14 	 *
     15 	 * A header image. This is where saves via the Customizer API are
     16 	 * abstracted away, plus our own Ajax calls to add images to and remove
     17 	 * images from the user's recently uploaded images setting on the server.
     18 	 * These calls are made regardless of whether the user actually saves new
     19 	 * Customizer settings.
     20 	 *
     21 	 * @memberOf wp.customize.HeaderTool
     22 	 * @alias wp.customize.HeaderTool.ImageModel
     23 	 *
     24 	 * @constructor
     25 	 * @augments Backbone.Model
     26 	 */
     27 	api.HeaderTool.ImageModel = Backbone.Model.extend(/** @lends wp.customize.HeaderTool.ImageModel.prototype */{
     28 		defaults: function() {
     29 			return {
     30 				header: {
     31 					attachment_id: 0,
     32 					url: '',
     33 					timestamp: _.now(),
     34 					thumbnail_url: ''
     35 				},
     36 				choice: '',
     37 				selected: false,
     38 				random: false
     39 			};
     40 		},
     41 
     42 		initialize: function() {
     43 			this.on('hide', this.hide, this);
     44 		},
     45 
     46 		hide: function() {
     47 			this.set('choice', '');
     48 			api('header_image').set('remove-header');
     49 			api('header_image_data').set('remove-header');
     50 		},
     51 
     52 		destroy: function() {
     53 			var data = this.get('header'),
     54 				curr = api.HeaderTool.currentHeader.get('header').attachment_id;
     55 
     56 			// If the image we're removing is also the current header,
     57 			// unset the latter.
     58 			if (curr && data.attachment_id === curr) {
     59 				api.HeaderTool.currentHeader.trigger('hide');
     60 			}
     61 
     62 			wp.ajax.post( 'custom-header-remove', {
     63 				nonce: _wpCustomizeHeader.nonces.remove,
     64 				wp_customize: 'on',
     65 				theme: api.settings.theme.stylesheet,
     66 				attachment_id: data.attachment_id
     67 			});
     68 
     69 			this.trigger('destroy', this, this.collection);
     70 		},
     71 
     72 		save: function() {
     73 			if (this.get('random')) {
     74 				api('header_image').set(this.get('header').random);
     75 				api('header_image_data').set(this.get('header').random);
     76 			} else {
     77 				if (this.get('header').defaultName) {
     78 					api('header_image').set(this.get('header').url);
     79 					api('header_image_data').set(this.get('header').defaultName);
     80 				} else {
     81 					api('header_image').set(this.get('header').url);
     82 					api('header_image_data').set(this.get('header'));
     83 				}
     84 			}
     85 
     86 			api.HeaderTool.combinedList.trigger('control:setImage', this);
     87 		},
     88 
     89 		importImage: function() {
     90 			var data = this.get('header');
     91 			if (data.attachment_id === undefined) {
     92 				return;
     93 			}
     94 
     95 			wp.ajax.post( 'custom-header-add', {
     96 				nonce: _wpCustomizeHeader.nonces.add,
     97 				wp_customize: 'on',
     98 				theme: api.settings.theme.stylesheet,
     99 				attachment_id: data.attachment_id
    100 			} );
    101 		},
    102 
    103 		shouldBeCropped: function() {
    104 			if (this.get('themeFlexWidth') === true &&
    105 						this.get('themeFlexHeight') === true) {
    106 				return false;
    107 			}
    108 
    109 			if (this.get('themeFlexWidth') === true &&
    110 				this.get('themeHeight') === this.get('imageHeight')) {
    111 				return false;
    112 			}
    113 
    114 			if (this.get('themeFlexHeight') === true &&
    115 				this.get('themeWidth') === this.get('imageWidth')) {
    116 				return false;
    117 			}
    118 
    119 			if (this.get('themeWidth') === this.get('imageWidth') &&
    120 				this.get('themeHeight') === this.get('imageHeight')) {
    121 				return false;
    122 			}
    123 
    124 			if (this.get('imageWidth') <= this.get('themeWidth')) {
    125 				return false;
    126 			}
    127 
    128 			return true;
    129 		}
    130 	});
    131 
    132 
    133 	/**
    134 	 * wp.customize.HeaderTool.ChoiceList
    135 	 *
    136 	 * @memberOf wp.customize.HeaderTool
    137 	 * @alias wp.customize.HeaderTool.ChoiceList
    138 	 *
    139 	 * @constructor
    140 	 * @augments Backbone.Collection
    141 	 */
    142 	api.HeaderTool.ChoiceList = Backbone.Collection.extend({
    143 		model: api.HeaderTool.ImageModel,
    144 
    145 		// Ordered from most recently used to least.
    146 		comparator: function(model) {
    147 			return -model.get('header').timestamp;
    148 		},
    149 
    150 		initialize: function() {
    151 			var current = api.HeaderTool.currentHeader.get('choice').replace(/^https?:\/\//, ''),
    152 				isRandom = this.isRandomChoice(api.get().header_image);
    153 
    154 			// Overridable by an extending class.
    155 			if (!this.type) {
    156 				this.type = 'uploaded';
    157 			}
    158 
    159 			// Overridable by an extending class.
    160 			if (typeof this.data === 'undefined') {
    161 				this.data = _wpCustomizeHeader.uploads;
    162 			}
    163 
    164 			if (isRandom) {
    165 				// So that when adding data we don't hide regular images.
    166 				current = api.get().header_image;
    167 			}
    168 
    169 			this.on('control:setImage', this.setImage, this);
    170 			this.on('control:removeImage', this.removeImage, this);
    171 			this.on('add', this.maybeRemoveOldCrop, this);
    172 			this.on('add', this.maybeAddRandomChoice, this);
    173 
    174 			_.each(this.data, function(elt, index) {
    175 				if (!elt.attachment_id) {
    176 					elt.defaultName = index;
    177 				}
    178 
    179 				if (typeof elt.timestamp === 'undefined') {
    180 					elt.timestamp = 0;
    181 				}
    182 
    183 				this.add({
    184 					header: elt,
    185 					choice: elt.url.split('/').pop(),
    186 					selected: current === elt.url.replace(/^https?:\/\//, '')
    187 				}, { silent: true });
    188 			}, this);
    189 
    190 			if (this.size() > 0) {
    191 				this.addRandomChoice(current);
    192 			}
    193 		},
    194 
    195 		maybeRemoveOldCrop: function( model ) {
    196 			var newID = model.get( 'header' ).attachment_id || false,
    197 			 	oldCrop;
    198 
    199 			// Bail early if we don't have a new attachment ID.
    200 			if ( ! newID ) {
    201 				return;
    202 			}
    203 
    204 			oldCrop = this.find( function( item ) {
    205 				return ( item.cid !== model.cid && item.get( 'header' ).attachment_id === newID );
    206 			} );
    207 
    208 			// If we found an old crop, remove it from the collection.
    209 			if ( oldCrop ) {
    210 				this.remove( oldCrop );
    211 			}
    212 		},
    213 
    214 		maybeAddRandomChoice: function() {
    215 			if (this.size() === 1) {
    216 				this.addRandomChoice();
    217 			}
    218 		},
    219 
    220 		addRandomChoice: function(initialChoice) {
    221 			var isRandomSameType = RegExp(this.type).test(initialChoice),
    222 				randomChoice = 'random-' + this.type + '-image';
    223 
    224 			this.add({
    225 				header: {
    226 					timestamp: 0,
    227 					random: randomChoice,
    228 					width: 245,
    229 					height: 41
    230 				},
    231 				choice: randomChoice,
    232 				random: true,
    233 				selected: isRandomSameType
    234 			});
    235 		},
    236 
    237 		isRandomChoice: function(choice) {
    238 			return (/^random-(uploaded|default)-image$/).test(choice);
    239 		},
    240 
    241 		shouldHideTitle: function() {
    242 			return this.size() < 2;
    243 		},
    244 
    245 		setImage: function(model) {
    246 			this.each(function(m) {
    247 				m.set('selected', false);
    248 			});
    249 
    250 			if (model) {
    251 				model.set('selected', true);
    252 			}
    253 		},
    254 
    255 		removeImage: function() {
    256 			this.each(function(m) {
    257 				m.set('selected', false);
    258 			});
    259 		}
    260 	});
    261 
    262 
    263 	/**
    264 	 * wp.customize.HeaderTool.DefaultsList
    265 	 *
    266 	 * @memberOf wp.customize.HeaderTool
    267 	 * @alias wp.customize.HeaderTool.DefaultsList
    268 	 *
    269 	 * @constructor
    270 	 * @augments wp.customize.HeaderTool.ChoiceList
    271 	 * @augments Backbone.Collection
    272 	 */
    273 	api.HeaderTool.DefaultsList = api.HeaderTool.ChoiceList.extend({
    274 		initialize: function() {
    275 			this.type = 'default';
    276 			this.data = _wpCustomizeHeader.defaults;
    277 			api.HeaderTool.ChoiceList.prototype.initialize.apply(this);
    278 		}
    279 	});
    280 
    281 })( jQuery, window.wp );