Add some docs to Customizer JS.

Props ericlewis.
See #29157.

Built from https://develop.svn.wordpress.org/trunk@29450


git-svn-id: http://core.svn.wordpress.org/trunk@29228 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Scott Taylor 2014-08-08 22:10:15 +00:00
parent 13aee01e2b
commit c6ebc35a00
3 changed files with 113 additions and 49 deletions

View File

@ -1,25 +1,22 @@
window.wp = window.wp || {}; window.wp = window.wp || {};
(function( exports, $ ){ (function( exports, $ ){
var api, extend, ctor, inherits, var api = {}, ctor, inherits,
slice = Array.prototype.slice; slice = Array.prototype.slice;
/* =====================================================================
* Micro-inheritance - thank you, backbone.js.
* ===================================================================== */
extend = function( protoProps, classProps ) {
var child = inherits( this, protoProps, classProps );
child.extend = this.extend;
return child;
};
// Shared empty constructor function to aid in prototype-chain creation. // Shared empty constructor function to aid in prototype-chain creation.
ctor = function() {}; ctor = function() {};
// Helper function to correctly set up the prototype chain, for subclasses. /**
// Similar to `goog.inherits`, but uses a hash of prototype properties and * Helper function to correctly set up the prototype chain, for subclasses.
// class properties to be extended. * Similar to `goog.inherits`, but uses a hash of prototype properties and
* class properties to be extended.
*
* @param object parent Parent class constructor to inherit from.
* @param object protoProps Properties to apply to the prototype for use as class instance properties.
* @param object staticProps Properties to apply directly to the class constructor.
* @return child The subclassed constructor.
*/
inherits = function( parent, protoProps, staticProps ) { inherits = function( parent, protoProps, staticProps ) {
var child; var child;
@ -65,12 +62,9 @@ window.wp = window.wp || {};
return child; return child;
}; };
api = {}; /**
* Base class for object inheritance.
/* ===================================================================== */
* Base class.
* ===================================================================== */
api.Class = function( applicator, argsArray, options ) { api.Class = function( applicator, argsArray, options ) {
var magic, args = arguments; var magic, args = arguments;
@ -92,6 +86,19 @@ window.wp = window.wp || {};
return magic; return magic;
}; };
/**
* Creates a subclass of the class.
*
* @param object protoProps Properties to apply to the prototype.
* @param object staticProps Properties to apply directly to the class.
* @return child The subclass.
*/
api.Class.extend = function( protoProps, classProps ) {
var child = inherits( this, protoProps, classProps );
child.extend = this.extend;
return child;
};
api.Class.applicator = {}; api.Class.applicator = {};
api.Class.prototype.initialize = function() {}; api.Class.prototype.initialize = function() {};
@ -116,12 +123,11 @@ window.wp = window.wp || {};
return false; return false;
}; };
api.Class.extend = extend; /**
* An events manager object, offering the ability to bind to and trigger events.
/* ===================================================================== *
* Events mixin. * Used as a mixin.
* ===================================================================== */ */
api.Events = { api.Events = {
trigger: function( id ) { trigger: function( id ) {
if ( this.topics && this.topics[ id ] ) if ( this.topics && this.topics[ id ] )
@ -143,10 +149,11 @@ window.wp = window.wp || {};
} }
}; };
/* ===================================================================== /**
* Observable values that support two-way binding. * Observable values that support two-way binding.
* ===================================================================== */ *
* @constuctor
*/
api.Value = api.Class.extend({ api.Value = api.Class.extend({
initialize: function( initial, options ) { initialize: function( initial, options ) {
this._value = initial; // @todo: potentially change this to a this.set() call. this._value = initial; // @todo: potentially change this to a this.set() call.
@ -254,10 +261,13 @@ window.wp = window.wp || {};
} }
}); });
/* ===================================================================== /**
* A collection of observable values. * A collection of observable values.
* ===================================================================== */ *
* @constuctor
* @augments wp.customize.Class
* @mixes wp.customize.Events
*/
api.Values = api.Class.extend({ api.Values = api.Class.extend({
defaultConstructor: api.Value, defaultConstructor: api.Value,
@ -379,16 +389,25 @@ window.wp = window.wp || {};
$.extend( api.Values.prototype, api.Events ); $.extend( api.Values.prototype, api.Events );
/* =====================================================================
* An observable value that syncs with an element.
*
* Handles inputs, selects, and textareas by default.
* ===================================================================== */
/**
* Cast a string to a jQuery collection if it isn't already.
*
* @param {string|jQuery collection} element
*/
api.ensure = function( element ) { api.ensure = function( element ) {
return typeof element == 'string' ? $( element ) : element; return typeof element == 'string' ? $( element ) : element;
}; };
/**
* An observable value that syncs with an element.
*
* Handles inputs, selects, and textareas by default.
*
* @constuctor
* @augments wp.customize.Value
* @augments wp.customize.Class
*/
api.Element = api.Value.extend({ api.Element = api.Value.extend({
initialize: function( element, options ) { initialize: function( element, options ) {
var self = this, var self = this,
@ -442,7 +461,7 @@ window.wp = window.wp || {};
api.Element.synchronizer = {}; api.Element.synchronizer = {};
$.each( [ 'html', 'val' ], function( i, method ) { $.each( [ 'html', 'val' ], function( index, method ) {
api.Element.synchronizer[ method ] = { api.Element.synchronizer[ method ] = {
update: function( to ) { update: function( to ) {
this.element[ method ]( to ); this.element[ method ]( to );
@ -473,13 +492,24 @@ window.wp = window.wp || {};
} }
}; };
/* =====================================================================
* Messenger for postMessage.
* ===================================================================== */
$.support.postMessage = !! window.postMessage; $.support.postMessage = !! window.postMessage;
/**
* Messenger for postMessage.
*
* @constuctor
* @augments wp.customize.Class
* @mixes wp.customize.Events
*/
api.Messenger = api.Class.extend({ api.Messenger = api.Class.extend({
/**
* Create a new Value.
*
* @param {string} key Unique identifier.
* @param {mixed} initial Initial value.
* @param {mixed} options Options hash. Optional.
* @return {Value} Class instance of the Value.
*/
add: function( key, initial, options ) { add: function( key, initial, options ) {
return this[ key ] = new api.Value( initial, options ); return this[ key ] = new api.Value( initial, options );
}, },
@ -570,10 +600,7 @@ window.wp = window.wp || {};
// Add the Events mixin to api.Messenger. // Add the Events mixin to api.Messenger.
$.extend( api.Messenger.prototype, api.Events ); $.extend( api.Messenger.prototype, api.Events );
/* ===================================================================== // Core customize object.
* Core customize object.
* ===================================================================== */
api = $.extend( new api.Values(), api ); api = $.extend( new api.Values(), api );
api.get = function() { api.get = function() {
var result = {}; var result = {};
@ -585,6 +612,6 @@ window.wp = window.wp || {};
return result; return result;
}; };
// Expose the API to the world. // Expose the API publicly on window.wp.customize
exports.customize = api; exports.customize = api;
})( wp, jQuery ); })( wp, jQuery );

File diff suppressed because one or more lines are too long

View File

@ -10,7 +10,20 @@ window.wp = window.wp || {};
hashchange: ('onhashchange' in window) && (document.documentMode === undefined || document.documentMode > 7) hashchange: ('onhashchange' in window) && (document.documentMode === undefined || document.documentMode > 7)
}); });
/**
* Allows the Customizer to be overlayed on any page.
*
* By default, any element in the body with the load-customize class will open
* the Customizer overlay with the URL specified.
*
* e.g. <a class="load-customize" href="http://siteurl.com/2014/01/02/post">Open customizer</a>
*
* @augments wp.customize.Events
*/
Loader = $.extend( {}, api.Events, { Loader = $.extend( {}, api.Events, {
/**
* Setup the Loader; triggered on document#ready.
*/
initialize: function() { initialize: function() {
this.body = $( document.body ); this.body = $( document.body );
@ -23,9 +36,12 @@ window.wp = window.wp || {};
this.window = $( window ); this.window = $( window );
this.element = $( '<div id="customize-container" />' ).appendTo( this.body ); this.element = $( '<div id="customize-container" />' ).appendTo( this.body );
// Bind events for opening and closing the overlay.
this.bind( 'open', this.overlay.show ); this.bind( 'open', this.overlay.show );
this.bind( 'close', this.overlay.hide ); this.bind( 'close', this.overlay.hide );
// Any element in the body with the `load-customize` class opens
// the Customizer.
$('#wpbody').on( 'click', '.load-customize', function( event ) { $('#wpbody').on( 'click', '.load-customize', function( event ) {
event.preventDefault(); event.preventDefault();
@ -73,6 +89,11 @@ window.wp = window.wp || {};
} }
}, },
/**
* Open the customizer overlay for a specific URL.
*
* @param string src URL to load in the Customizer.
*/
open: function( src ) { open: function( src ) {
if ( this.active ) { if ( this.active ) {
@ -148,10 +169,16 @@ window.wp = window.wp || {};
} }
}, },
/**
* Callback after the customizer has been opened.
*/
opened: function() { opened: function() {
Loader.body.addClass( 'customize-active full-overlay-active' ); Loader.body.addClass( 'customize-active full-overlay-active' );
}, },
/**
* Close the Customizer overlay and return focus to the link that opened it.
*/
close: function() { close: function() {
if ( ! this.active ) { if ( ! this.active ) {
return; return;
@ -174,6 +201,9 @@ window.wp = window.wp || {};
} }
}, },
/**
* Callback after the customizer has been closed.
*/
closed: function() { closed: function() {
Loader.iframe.remove(); Loader.iframe.remove();
Loader.messenger.destroy(); Loader.messenger.destroy();
@ -184,10 +214,16 @@ window.wp = window.wp || {};
$( window ).off( 'beforeunload', Loader.beforeunload ); $( window ).off( 'beforeunload', Loader.beforeunload );
}, },
/**
* Callback for the `load` event on the Customizer iframe.
*/
loaded: function() { loaded: function() {
Loader.body.removeClass('customize-loading'); Loader.body.removeClass('customize-loading');
}, },
/**
* Overlay hide/show utility methods.
*/
overlay: { overlay: {
show: function() { show: function() {
this.element.fadeIn( 200, Loader.opened ); this.element.fadeIn( 200, Loader.opened );
@ -199,11 +235,12 @@ window.wp = window.wp || {};
} }
}); });
// Bootstrap the Loader on document#ready.
$( function() { $( function() {
Loader.settings = _wpCustomizeLoaderSettings; Loader.settings = _wpCustomizeLoaderSettings;
Loader.initialize(); Loader.initialize();
}); });
// Expose the API to the world. // Expose the API publicly on window.wp.customize.Loader
api.Loader = Loader; api.Loader = Loader;
})( wp, jQuery ); })( wp, jQuery );