PageSourceSearch

https://cncpromax.com/wp-includes/js/customize-models.js?ver=5.1.2

js cncpromax.com collected 2026-09-24 14:41:38 UTC 6,821 bytes, 281 lines download raw bytes

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 );

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.