diff options
Diffstat (limited to 'wp-includes/js/customize-models.js')
-rw-r--r-- | wp-includes/js/customize-models.js | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/wp-includes/js/customize-models.js b/wp-includes/js/customize-models.js new file mode 100644 index 0000000..e722663 --- /dev/null +++ b/wp-includes/js/customize-models.js @@ -0,0 +1,281 @@ +/** + * @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 ); |