2016-11-04 13:18:26 -04:00
|
|
|
/* global _wpCustomizeHeader, _wpCustomizeBackground, _wpMediaViewsL10n, MediaElementPlayer */
|
2012-08-22 20:04:18 -04:00
|
|
|
(function( exports, $ ){
|
2016-09-23 18:23:30 -04:00
|
|
|
var Container, focus, normalizedTransitionendEventName, api = wp.customize;
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2013-11-11 08:32:10 -05:00
|
|
|
/**
|
2015-09-05 15:53:24 -04:00
|
|
|
* A Customizer Setting.
|
|
|
|
*
|
|
|
|
* A setting is WordPress data (theme mod, option, menu, etc.) that the user can
|
|
|
|
* draft changes to in the Customizer.
|
|
|
|
*
|
|
|
|
* @see PHP class WP_Customize_Setting.
|
|
|
|
*
|
2014-11-11 18:52:22 -05:00
|
|
|
* @class
|
2014-08-08 19:31:15 -04:00
|
|
|
* @augments wp.customize.Value
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
*
|
2015-09-05 15:53:24 -04:00
|
|
|
* @param {object} id The Setting ID.
|
|
|
|
* @param {object} value The initial value of the setting.
|
|
|
|
* @param {object} options.previewer The Previewer instance to sync with.
|
|
|
|
* @param {object} options.transport The transport to use for previewing. Supports 'refresh' and 'postMessage'.
|
|
|
|
* @param {object} options.dirty
|
2012-08-22 20:04:18 -04:00
|
|
|
*/
|
|
|
|
api.Setting = api.Value.extend({
|
|
|
|
initialize: function( id, value, options ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
var setting = this;
|
|
|
|
api.Value.prototype.initialize.call( setting, value, options );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
setting.id = id;
|
|
|
|
setting.transport = setting.transport || 'refresh';
|
|
|
|
setting._dirty = options.dirty || false;
|
|
|
|
setting.notifications = new api.Values({ defaultConstructor: api.Notification });
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-09-05 15:53:24 -04:00
|
|
|
// Whenever the setting's value changes, refresh the preview.
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
setting.bind( setting.preview );
|
2012-08-22 20:04:18 -04:00
|
|
|
},
|
2015-09-05 15:53:24 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Refresh the preview, respective of the setting's refresh policy.
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
*
|
|
|
|
* If the preview hasn't sent a keep-alive message and is likely
|
|
|
|
* disconnected by having navigated to a non-allowed URL, then the
|
|
|
|
* refresh transport will be forced when postMessage is the transport.
|
|
|
|
* Note that postMessage does not throw an error when the recipient window
|
|
|
|
* fails to match the origin window, so using try/catch around the
|
|
|
|
* previewer.send() call to then fallback to refresh will not work.
|
|
|
|
*
|
|
|
|
* @since 3.4.0
|
2016-11-23 01:05:32 -05:00
|
|
|
* @access public
|
|
|
|
*
|
|
|
|
* @returns {void}
|
2015-09-05 15:53:24 -04:00
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
preview: function() {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
var setting = this, transport;
|
|
|
|
transport = setting.transport;
|
|
|
|
|
|
|
|
if ( 'postMessage' === transport && ! api.state( 'previewerAlive' ).get() ) {
|
|
|
|
transport = 'refresh';
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( 'postMessage' === transport ) {
|
2016-11-23 01:05:32 -05:00
|
|
|
setting.previewer.send( 'setting', [ setting.id, setting() ] );
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
} else if ( 'refresh' === transport ) {
|
2016-11-23 01:05:32 -05:00
|
|
|
setting.previewer.refresh();
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
2016-06-14 15:17:28 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find controls associated with this setting.
|
|
|
|
*
|
|
|
|
* @since 4.6.0
|
|
|
|
* @returns {wp.customize.Control[]} Controls associated with setting.
|
|
|
|
*/
|
|
|
|
findControls: function() {
|
|
|
|
var setting = this, controls = [];
|
|
|
|
api.control.each( function( control ) {
|
|
|
|
_.each( control.settings, function( controlSetting ) {
|
|
|
|
if ( controlSetting.id === setting.id ) {
|
|
|
|
controls.push( control );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
return controls;
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2014-12-02 17:56:45 -05:00
|
|
|
/**
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
* Current change count.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
|
|
|
* @type {number}
|
|
|
|
* @protected
|
|
|
|
*/
|
|
|
|
api._latestRevision = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Last revision that was saved.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
|
|
|
* @type {number}
|
|
|
|
* @protected
|
|
|
|
*/
|
|
|
|
api._lastSavedRevision = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Latest revisions associated with the updated setting.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
|
|
|
* @type {object}
|
|
|
|
* @protected
|
|
|
|
*/
|
|
|
|
api._latestSettingRevisions = {};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Keep track of the revision associated with each updated setting so that
|
|
|
|
* requestChangesetUpdate knows which dirty settings to include. Also, once
|
|
|
|
* ready is triggered and all initial settings have been added, increment
|
|
|
|
* revision for each newly-created initially-dirty setting so that it will
|
|
|
|
* also be included in changeset update requests.
|
|
|
|
*/
|
|
|
|
api.bind( 'change', function incrementChangedSettingRevision( setting ) {
|
|
|
|
api._latestRevision += 1;
|
|
|
|
api._latestSettingRevisions[ setting.id ] = api._latestRevision;
|
|
|
|
} );
|
|
|
|
api.bind( 'ready', function() {
|
|
|
|
api.bind( 'add', function incrementCreatedSettingRevision( setting ) {
|
|
|
|
if ( setting._dirty ) {
|
|
|
|
api._latestRevision += 1;
|
|
|
|
api._latestSettingRevisions[ setting.id ] = api._latestRevision;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the dirty setting values.
|
|
|
|
*
|
2016-11-23 01:05:32 -05:00
|
|
|
* @since 4.7.0
|
|
|
|
* @access public
|
|
|
|
*
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
* @param {object} [options] Options.
|
|
|
|
* @param {boolean} [options.unsaved=false] Whether only values not saved yet into a changeset will be returned (differential changes).
|
|
|
|
* @returns {object} Dirty setting values.
|
|
|
|
*/
|
|
|
|
api.dirtyValues = function dirtyValues( options ) {
|
|
|
|
var values = {};
|
|
|
|
api.each( function( setting ) {
|
|
|
|
var settingRevision;
|
|
|
|
|
|
|
|
if ( ! setting._dirty ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
settingRevision = api._latestSettingRevisions[ setting.id ];
|
|
|
|
|
|
|
|
// Skip including settings that have already been included in the changeset, if only requesting unsaved.
|
Customize: Introduce starter content and site freshness state.
A theme can opt-in for tailored starter content to apply to the customizer when previewing the theme on a fresh install, when `fresh_site` is at its initial `1` value. Starter content is staged in the customizer and does not go live unless the changes are published. Initial starter content is added to Twenty Seventeen.
* The `fresh_site` flag is cleared when a published post or page is saved, when widgets are modified, or when the customizer state is saved.
* Starter content is registered via `starter-content` theme support, where the argument is an array containing `widgets`, `posts`, `nav_menus`, `options`, and `theme_mods`. Posts/pages in starter content are created with the `auto-draft` status, re-using the page/post stubs feature added to nav menus and the static front page controls.
* A `get_theme_starter_content` filter allows for plugins to extend a theme's starter content.
* Starter content in themes can/should re-use existing starter content items in core by using named placeholders.
* Import theme starter content into customized state when fresh site.
* Prevent original_title differences from causing refreshes if title is present.
* Ensure nav menu item url is set according to object when previewing.
* Make sure initial saved state is false if there are dirty settings without an existing changeset.
* Ensure dirty settings are cleaned upon changeset publishing.
Props helen, westonruter, ocean90.
Fixes #38114, #38533.
Built from https://develop.svn.wordpress.org/trunk@38991
git-svn-id: http://core.svn.wordpress.org/trunk@38934 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-27 22:57:35 -04:00
|
|
|
if ( api.state( 'changesetStatus' ).get() && ( options && options.unsaved ) && ( _.isUndefined( settingRevision ) || settingRevision <= api._lastSavedRevision ) ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
values[ setting.id ] = setting.get();
|
|
|
|
} );
|
|
|
|
return values;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Request updates to the changeset.
|
|
|
|
*
|
2016-11-23 01:05:32 -05:00
|
|
|
* @since 4.7.0
|
|
|
|
* @access public
|
|
|
|
*
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
* @param {object} [changes] Mapping of setting IDs to setting params each normally including a value property, or mapping to null.
|
|
|
|
* If not provided, then the changes will still be obtained from unsaved dirty settings.
|
2016-11-23 01:05:32 -05:00
|
|
|
* @returns {jQuery.Promise} Promise resolving with the response data.
|
2014-12-02 17:56:45 -05:00
|
|
|
*/
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
api.requestChangesetUpdate = function requestChangesetUpdate( changes ) {
|
|
|
|
var deferred, request, submittedChanges = {}, data;
|
|
|
|
deferred = new $.Deferred();
|
|
|
|
|
|
|
|
if ( changes ) {
|
|
|
|
_.extend( submittedChanges, changes );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Ensure all revised settings (changes pending save) are also included, but not if marked for deletion in changes.
|
|
|
|
_.each( api.dirtyValues( { unsaved: true } ), function( dirtyValue, settingId ) {
|
|
|
|
if ( ! changes || null !== changes[ settingId ] ) {
|
|
|
|
submittedChanges[ settingId ] = _.extend(
|
|
|
|
{},
|
|
|
|
submittedChanges[ settingId ] || {},
|
|
|
|
{ value: dirtyValue }
|
|
|
|
);
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Short-circuit when there are no pending changes.
|
|
|
|
if ( _.isEmpty( submittedChanges ) ) {
|
|
|
|
deferred.resolve( {} );
|
|
|
|
return deferred.promise();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Make sure that publishing a changeset waits for all changeset update requests to complete.
|
|
|
|
api.state( 'processing' ).set( api.state( 'processing' ).get() + 1 );
|
|
|
|
deferred.always( function() {
|
|
|
|
api.state( 'processing' ).set( api.state( 'processing' ).get() - 1 );
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Allow plugins to attach additional params to the settings.
|
|
|
|
api.trigger( 'changeset-save', submittedChanges );
|
|
|
|
|
|
|
|
// Ensure that if any plugins add data to save requests by extending query() that they get included here.
|
|
|
|
data = api.previewer.query( { excludeCustomizedSaved: true } );
|
|
|
|
delete data.customized; // Being sent in customize_changeset_data instead.
|
|
|
|
_.extend( data, {
|
|
|
|
nonce: api.settings.nonce.save,
|
|
|
|
customize_theme: api.settings.theme.stylesheet,
|
|
|
|
customize_changeset_data: JSON.stringify( submittedChanges )
|
|
|
|
} );
|
|
|
|
|
|
|
|
request = wp.ajax.post( 'customize_save', data );
|
|
|
|
|
|
|
|
request.done( function requestChangesetUpdateDone( data ) {
|
|
|
|
var savedChangesetValues = {};
|
|
|
|
|
|
|
|
// Ensure that all settings updated subsequently will be included in the next changeset update request.
|
|
|
|
api._lastSavedRevision = Math.max( api._latestRevision, api._lastSavedRevision );
|
|
|
|
|
|
|
|
api.state( 'changesetStatus' ).set( data.changeset_status );
|
|
|
|
deferred.resolve( data );
|
|
|
|
api.trigger( 'changeset-saved', data );
|
|
|
|
|
|
|
|
if ( data.setting_validities ) {
|
|
|
|
_.each( data.setting_validities, function( validity, settingId ) {
|
|
|
|
if ( true === validity && _.isObject( submittedChanges[ settingId ] ) && ! _.isUndefined( submittedChanges[ settingId ].value ) ) {
|
|
|
|
savedChangesetValues[ settingId ] = submittedChanges[ settingId ].value;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
|
|
|
api.previewer.send( 'changeset-saved', _.extend( {}, data, { saved_changeset_values: savedChangesetValues } ) );
|
|
|
|
} );
|
|
|
|
request.fail( function requestChangesetUpdateFail( data ) {
|
|
|
|
deferred.reject( data );
|
|
|
|
api.trigger( 'changeset-error', data );
|
|
|
|
} );
|
|
|
|
request.always( function( data ) {
|
|
|
|
if ( data.setting_validities ) {
|
|
|
|
api._handleSettingValidities( {
|
|
|
|
settingValidities: data.setting_validities
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
return deferred.promise();
|
|
|
|
};
|
2014-12-02 17:56:45 -05:00
|
|
|
|
2014-08-08 19:31:15 -04:00
|
|
|
/**
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* Watch all changes to Value properties, and bubble changes to parent Values instance
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @param {wp.customize.Class} instance
|
2014-12-03 21:04:22 -05:00
|
|
|
* @param {Array} properties The names of the Value instances to watch.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
2014-12-02 17:56:45 -05:00
|
|
|
api.utils.bubbleChildValueChanges = function ( instance, properties ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
$.each( properties, function ( i, key ) {
|
|
|
|
instance[ key ].bind( function ( to, from ) {
|
|
|
|
if ( instance.parent && to !== from ) {
|
|
|
|
instance.parent.trigger( 'change', instance );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Expand a panel, section, or control and focus on the first focusable element.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
|
|
|
* @param {Object} [params]
|
2016-01-22 16:21:26 -05:00
|
|
|
* @param {Function} [params.completeCallback]
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
focus = function ( params ) {
|
2016-03-30 17:41:26 -04:00
|
|
|
var construct, completeCallback, focus, focusElement;
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
construct = this;
|
|
|
|
params = params || {};
|
|
|
|
focus = function () {
|
2015-03-29 07:17:28 -04:00
|
|
|
var focusContainer;
|
2016-09-23 18:23:30 -04:00
|
|
|
if ( ( construct.extended( api.Panel ) || construct.extended( api.Section ) ) && construct.expanded && construct.expanded() ) {
|
|
|
|
focusContainer = construct.contentContainer;
|
2015-03-29 07:17:28 -04:00
|
|
|
} else {
|
|
|
|
focusContainer = construct.container;
|
|
|
|
}
|
2015-08-08 05:37:26 -04:00
|
|
|
|
2016-03-30 17:41:26 -04:00
|
|
|
focusElement = focusContainer.find( '.control-focus:first' );
|
|
|
|
if ( 0 === focusElement.length ) {
|
|
|
|
// Note that we can't use :focusable due to a jQuery UI issue. See: https://github.com/jquery/jquery-ui/pull/1583
|
|
|
|
focusElement = focusContainer.find( 'input, select, textarea, button, object, a[href], [tabindex]' ).filter( ':visible' ).first();
|
|
|
|
}
|
|
|
|
focusElement.focus();
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
};
|
|
|
|
if ( params.completeCallback ) {
|
|
|
|
completeCallback = params.completeCallback;
|
|
|
|
params.completeCallback = function () {
|
|
|
|
focus();
|
|
|
|
completeCallback();
|
|
|
|
};
|
|
|
|
} else {
|
|
|
|
params.completeCallback = focus;
|
|
|
|
}
|
2016-09-01 01:55:27 -04:00
|
|
|
|
|
|
|
api.state( 'paneVisible' ).set( true );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
if ( construct.expand ) {
|
|
|
|
construct.expand( params );
|
|
|
|
} else {
|
|
|
|
params.completeCallback();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-11-03 16:35:23 -05:00
|
|
|
/**
|
|
|
|
* Stable sort for Panels, Sections, and Controls.
|
|
|
|
*
|
|
|
|
* If a.priority() === b.priority(), then sort by their respective params.instanceNumber.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
2014-11-03 16:35:23 -05:00
|
|
|
* @param {(wp.customize.Panel|wp.customize.Section|wp.customize.Control)} a
|
|
|
|
* @param {(wp.customize.Panel|wp.customize.Section|wp.customize.Control)} b
|
|
|
|
* @returns {Number}
|
|
|
|
*/
|
2014-12-02 17:56:45 -05:00
|
|
|
api.utils.prioritySort = function ( a, b ) {
|
2014-11-03 16:35:23 -05:00
|
|
|
if ( a.priority() === b.priority() && typeof a.params.instanceNumber === 'number' && typeof b.params.instanceNumber === 'number' ) {
|
|
|
|
return a.params.instanceNumber - b.params.instanceNumber;
|
|
|
|
} else {
|
|
|
|
return a.priority() - b.priority();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
/**
|
|
|
|
* Return whether the supplied Event object is for a keydown event but not the Enter key.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @param {jQuery.Event} event
|
|
|
|
* @returns {boolean}
|
|
|
|
*/
|
2014-12-02 17:56:45 -05:00
|
|
|
api.utils.isKeydownButNotEnterEvent = function ( event ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
return ( 'keydown' === event.type && 13 !== event.which );
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return whether the two lists of elements are the same and are in the same order.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @param {Array|jQuery} listA
|
|
|
|
* @param {Array|jQuery} listB
|
|
|
|
* @returns {boolean}
|
|
|
|
*/
|
2014-12-02 17:56:45 -05:00
|
|
|
api.utils.areElementListsEqual = function ( listA, listB ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
var equal = (
|
|
|
|
listA.length === listB.length && // if lists are different lengths, then naturally they are not equal
|
2014-12-23 12:05:26 -05:00
|
|
|
-1 === _.indexOf( _.map( // are there any false values in the list returned by map?
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
_.zip( listA, listB ), // pair up each element between the two lists
|
|
|
|
function ( pair ) {
|
|
|
|
return $( pair[0] ).is( pair[1] ); // compare to see if each pair are equal
|
|
|
|
}
|
2014-12-23 12:05:26 -05:00
|
|
|
), false ) // check for presence of false in map's return value
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
);
|
|
|
|
return equal;
|
|
|
|
};
|
|
|
|
|
2016-09-23 18:23:30 -04:00
|
|
|
/**
|
|
|
|
* Return browser supported `transitionend` event name.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
|
|
|
*
|
|
|
|
* @returns {string|null} Normalized `transitionend` event name or null if CSS transitions are not supported.
|
|
|
|
*/
|
|
|
|
normalizedTransitionendEventName = (function () {
|
|
|
|
var el, transitions, prop;
|
|
|
|
el = document.createElement( 'div' );
|
|
|
|
transitions = {
|
|
|
|
'transition' : 'transitionend',
|
|
|
|
'OTransition' : 'oTransitionEnd',
|
|
|
|
'MozTransition' : 'transitionend',
|
|
|
|
'WebkitTransition': 'webkitTransitionEnd'
|
|
|
|
};
|
|
|
|
prop = _.find( _.keys( transitions ), function( prop ) {
|
|
|
|
return ! _.isUndefined( el.style[ prop ] );
|
|
|
|
} );
|
|
|
|
if ( prop ) {
|
|
|
|
return transitions[ prop ];
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
})();
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* Base class for Panel and Section.
|
|
|
|
*
|
|
|
|
* @since 4.1.0
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*
|
2014-11-11 18:52:22 -05:00
|
|
|
* @class
|
2014-08-08 19:31:15 -04:00
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
Container = api.Class.extend({
|
2014-11-11 17:37:22 -05:00
|
|
|
defaultActiveArguments: { duration: 'fast', completeCallback: $.noop },
|
|
|
|
defaultExpandedArguments: { duration: 'fast', completeCallback: $.noop },
|
2015-05-29 20:03:30 -04:00
|
|
|
containerType: 'container',
|
2015-06-01 18:47:25 -04:00
|
|
|
defaults: {
|
|
|
|
title: '',
|
|
|
|
description: '',
|
|
|
|
priority: 100,
|
|
|
|
type: 'default',
|
|
|
|
content: null,
|
|
|
|
active: true,
|
|
|
|
instanceNumber: null
|
|
|
|
},
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
2014-12-03 21:04:22 -05:00
|
|
|
/**
|
|
|
|
* @since 4.1.0
|
|
|
|
*
|
2015-06-01 18:47:25 -04:00
|
|
|
* @param {string} id - The ID for the container.
|
|
|
|
* @param {object} options - Object containing one property: params.
|
|
|
|
* @param {object} options.params - Object containing the following properties.
|
|
|
|
* @param {string} options.params.title - Title shown when panel is collapsed and expanded.
|
|
|
|
* @param {string=} [options.params.description] - Description shown at the top of the panel.
|
|
|
|
* @param {number=100} [options.params.priority] - The sort priority for the panel.
|
|
|
|
* @param {string=default} [options.params.type] - The type of the panel. See wp.customize.panelConstructor.
|
|
|
|
* @param {string=} [options.params.content] - The markup to be used for the panel container. If empty, a JS template is used.
|
|
|
|
* @param {boolean=true} [options.params.active] - Whether the panel is active or not.
|
2014-12-03 21:04:22 -05:00
|
|
|
*/
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
initialize: function ( id, options ) {
|
|
|
|
var container = this;
|
|
|
|
container.id = id;
|
2015-06-01 18:47:25 -04:00
|
|
|
options = options || {};
|
|
|
|
|
|
|
|
options.params = _.defaults(
|
|
|
|
options.params || {},
|
|
|
|
container.defaults
|
|
|
|
);
|
|
|
|
|
|
|
|
$.extend( container, options );
|
2015-05-29 20:03:30 -04:00
|
|
|
container.templateSelector = 'customize-' + container.containerType + '-' + container.params.type;
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
container.container = $( container.params.content );
|
2015-05-29 20:03:30 -04:00
|
|
|
if ( 0 === container.container.length ) {
|
|
|
|
container.container = $( container.getContainer() );
|
|
|
|
}
|
2016-09-23 18:23:30 -04:00
|
|
|
container.headContainer = container.container;
|
|
|
|
container.contentContainer = container.getContent();
|
|
|
|
container.container = container.container.add( container.contentContainer );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
|
|
|
container.deferred = {
|
2014-12-02 17:56:45 -05:00
|
|
|
embedded: new $.Deferred()
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
};
|
|
|
|
container.priority = new api.Value();
|
|
|
|
container.active = new api.Value();
|
|
|
|
container.activeArgumentsQueue = [];
|
|
|
|
container.expanded = new api.Value();
|
|
|
|
container.expandedArgumentsQueue = [];
|
|
|
|
|
|
|
|
container.active.bind( function ( active ) {
|
|
|
|
var args = container.activeArgumentsQueue.shift();
|
|
|
|
args = $.extend( {}, container.defaultActiveArguments, args );
|
|
|
|
active = ( active && container.isContextuallyActive() );
|
|
|
|
container.onChangeActive( active, args );
|
|
|
|
});
|
|
|
|
container.expanded.bind( function ( expanded ) {
|
|
|
|
var args = container.expandedArgumentsQueue.shift();
|
|
|
|
args = $.extend( {}, container.defaultExpandedArguments, args );
|
|
|
|
container.onChangeExpanded( expanded, args );
|
|
|
|
});
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-05-29 20:03:30 -04:00
|
|
|
container.deferred.embedded.done( function () {
|
|
|
|
container.attachEvents();
|
|
|
|
});
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-12-02 17:56:45 -05:00
|
|
|
api.utils.bubbleChildValueChanges( container, [ 'priority', 'active' ] );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-06-01 18:47:25 -04:00
|
|
|
container.priority.set( container.params.priority );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
container.active.set( container.params.active );
|
2014-12-02 17:56:45 -05:00
|
|
|
container.expanded.set( false );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @abstract
|
|
|
|
*/
|
|
|
|
ready: function() {},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the child models associated with this parent, sorting them by their priority Value.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @param {String} parentType
|
|
|
|
* @param {String} childType
|
|
|
|
* @returns {Array}
|
|
|
|
*/
|
|
|
|
_children: function ( parentType, childType ) {
|
|
|
|
var parent = this,
|
|
|
|
children = [];
|
|
|
|
api[ childType ].each( function ( child ) {
|
|
|
|
if ( child[ parentType ].get() === parent.id ) {
|
|
|
|
children.push( child );
|
|
|
|
}
|
|
|
|
} );
|
2014-12-02 17:56:45 -05:00
|
|
|
children.sort( api.utils.prioritySort );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
return children;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* To override by subclass, to return whether the container has active children.
|
2014-12-03 21:04:22 -05:00
|
|
|
*
|
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @abstract
|
|
|
|
*/
|
|
|
|
isContextuallyActive: function () {
|
2014-12-02 17:56:45 -05:00
|
|
|
throw new Error( 'Container.isContextuallyActive() must be overridden in a subclass.' );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2015-09-05 15:53:24 -04:00
|
|
|
* Active state change handler.
|
2014-12-03 21:04:22 -05:00
|
|
|
*
|
2015-09-05 15:53:24 -04:00
|
|
|
* Shows the container if it is active, hides it if not.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*
|
|
|
|
* To override by subclass, update the container's UI to reflect the provided active state.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
2017-03-18 20:04:43 -04:00
|
|
|
* @param {boolean} active - The active state to transiution to.
|
|
|
|
* @param {Object} [args] - Args.
|
|
|
|
* @param {Object} [args.duration] - The duration for the slideUp/slideDown animation.
|
|
|
|
* @param {boolean} [args.unchanged] - Whether the state is already known to not be changed, and so short-circuit with calling completeCallback early.
|
|
|
|
* @param {Function} [args.completeCallback] - Function to call when the slideUp/slideDown has completed.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
2015-08-26 03:26:21 -04:00
|
|
|
onChangeActive: function( active, args ) {
|
2016-09-23 18:23:30 -04:00
|
|
|
var construct = this,
|
|
|
|
headContainer = construct.headContainer,
|
|
|
|
duration, expandedOtherPanel;
|
|
|
|
|
2015-08-26 03:26:21 -04:00
|
|
|
if ( args.unchanged ) {
|
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-06-12 18:28:25 -04:00
|
|
|
duration = ( 'resolved' === api.previewer.deferred.active.state() ? args.duration : 0 );
|
2015-10-16 19:48:25 -04:00
|
|
|
|
|
|
|
if ( construct.extended( api.Panel ) ) {
|
|
|
|
// If this is a panel is not currently expanded but another panel is expanded, do not animate.
|
|
|
|
api.panel.each(function ( panel ) {
|
|
|
|
if ( panel !== construct && panel.expanded() ) {
|
|
|
|
expandedOtherPanel = panel;
|
|
|
|
duration = 0;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Collapse any expanded sections inside of this panel first before deactivating.
|
|
|
|
if ( ! active ) {
|
|
|
|
_.each( construct.sections(), function( section ) {
|
|
|
|
section.collapse( { duration: 0 } );
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-18 20:04:43 -04:00
|
|
|
if ( ! $.contains( document, headContainer.get( 0 ) ) ) {
|
|
|
|
// If the element is not in the DOM, then jQuery.fn.slideUp() does nothing. In this case, a hard toggle is required instead.
|
2016-09-23 18:23:30 -04:00
|
|
|
headContainer.toggle( active );
|
2014-12-15 14:54:21 -05:00
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
2014-11-11 17:37:22 -05:00
|
|
|
} else if ( active ) {
|
2017-03-18 20:04:43 -04:00
|
|
|
headContainer.slideDown( duration, args.completeCallback );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
} else {
|
2015-06-12 18:28:25 -04:00
|
|
|
if ( construct.expanded() ) {
|
|
|
|
construct.collapse({
|
|
|
|
duration: duration,
|
|
|
|
completeCallback: function() {
|
2017-03-18 20:04:43 -04:00
|
|
|
headContainer.slideUp( duration, args.completeCallback );
|
2015-06-12 18:28:25 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
2017-03-18 20:04:43 -04:00
|
|
|
headContainer.slideUp( duration, args.completeCallback );
|
2015-06-12 18:28:25 -04:00
|
|
|
}
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @params {Boolean} active
|
2014-12-03 21:04:22 -05:00
|
|
|
* @param {Object} [params]
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @returns {Boolean} false if state already applied
|
|
|
|
*/
|
|
|
|
_toggleActive: function ( active, params ) {
|
|
|
|
var self = this;
|
|
|
|
params = params || {};
|
|
|
|
if ( ( active && this.active.get() ) || ( ! active && ! this.active.get() ) ) {
|
|
|
|
params.unchanged = true;
|
|
|
|
self.onChangeActive( self.active.get(), params );
|
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
params.unchanged = false;
|
|
|
|
this.activeArgumentsQueue.push( params );
|
|
|
|
this.active.set( active );
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {Object} [params]
|
|
|
|
* @returns {Boolean} false if already active
|
|
|
|
*/
|
|
|
|
activate: function ( params ) {
|
|
|
|
return this._toggleActive( true, params );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {Object} [params]
|
|
|
|
* @returns {Boolean} false if already inactive
|
|
|
|
*/
|
|
|
|
deactivate: function ( params ) {
|
|
|
|
return this._toggleActive( false, params );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* To override by subclass, update the container's UI to reflect the provided active state.
|
|
|
|
* @abstract
|
|
|
|
*/
|
|
|
|
onChangeExpanded: function () {
|
|
|
|
throw new Error( 'Must override with subclass.' );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2015-10-16 19:48:25 -04:00
|
|
|
* Handle the toggle logic for expand/collapse.
|
|
|
|
*
|
|
|
|
* @param {Boolean} expanded - The new state to apply.
|
|
|
|
* @param {Object} [params] - Object containing options for expand/collapse.
|
|
|
|
* @param {Function} [params.completeCallback] - Function to call when expansion/collapse is complete.
|
|
|
|
* @returns {Boolean} false if state already applied or active state is false
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
2015-10-16 19:48:25 -04:00
|
|
|
_toggleExpanded: function( expanded, params ) {
|
|
|
|
var instance = this, previousCompleteCallback;
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
params = params || {};
|
2015-10-16 19:48:25 -04:00
|
|
|
previousCompleteCallback = params.completeCallback;
|
|
|
|
|
|
|
|
// Short-circuit expand() if the instance is not active.
|
|
|
|
if ( expanded && ! instance.active() ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-09-01 01:55:27 -04:00
|
|
|
api.state( 'paneVisible' ).set( true );
|
2015-10-16 19:48:25 -04:00
|
|
|
params.completeCallback = function() {
|
2015-03-07 06:06:29 -05:00
|
|
|
if ( previousCompleteCallback ) {
|
2015-10-16 19:48:25 -04:00
|
|
|
previousCompleteCallback.apply( instance, arguments );
|
2015-03-07 06:06:29 -05:00
|
|
|
}
|
|
|
|
if ( expanded ) {
|
2015-10-16 19:48:25 -04:00
|
|
|
instance.container.trigger( 'expanded' );
|
2015-03-07 06:06:29 -05:00
|
|
|
} else {
|
2015-10-16 19:48:25 -04:00
|
|
|
instance.container.trigger( 'collapsed' );
|
2015-03-07 06:06:29 -05:00
|
|
|
}
|
|
|
|
};
|
2015-10-16 19:48:25 -04:00
|
|
|
if ( ( expanded && instance.expanded.get() ) || ( ! expanded && ! instance.expanded.get() ) ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
params.unchanged = true;
|
2015-10-16 19:48:25 -04:00
|
|
|
instance.onChangeExpanded( instance.expanded.get(), params );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
params.unchanged = false;
|
2015-10-16 19:48:25 -04:00
|
|
|
instance.expandedArgumentsQueue.push( params );
|
|
|
|
instance.expanded.set( expanded );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {Object} [params]
|
2015-10-16 19:48:25 -04:00
|
|
|
* @returns {Boolean} false if already expanded or if inactive.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
expand: function ( params ) {
|
|
|
|
return this._toggleExpanded( true, params );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {Object} [params]
|
2015-10-16 19:48:25 -04:00
|
|
|
* @returns {Boolean} false if already collapsed.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
collapse: function ( params ) {
|
|
|
|
return this._toggleExpanded( false, params );
|
|
|
|
},
|
|
|
|
|
2016-09-23 18:23:30 -04:00
|
|
|
/**
|
|
|
|
* Animate container state change if transitions are supported by the browser.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
2016-11-23 01:05:32 -05:00
|
|
|
* @private
|
2016-09-23 18:23:30 -04:00
|
|
|
*
|
|
|
|
* @param {function} completeCallback Function to be called after transition is completed.
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
_animateChangeExpanded: function( completeCallback ) {
|
|
|
|
// Return if CSS transitions are not supported.
|
|
|
|
if ( ! normalizedTransitionendEventName ) {
|
|
|
|
if ( completeCallback ) {
|
|
|
|
completeCallback();
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var construct = this,
|
|
|
|
content = construct.contentContainer,
|
|
|
|
overlay = content.closest( '.wp-full-overlay' ),
|
2017-04-07 15:27:40 -04:00
|
|
|
elements, transitionEndCallback, transitionParentPane;
|
2016-09-23 18:23:30 -04:00
|
|
|
|
|
|
|
// Determine set of elements that are affected by the animation.
|
|
|
|
elements = overlay.add( content );
|
2017-04-07 15:27:40 -04:00
|
|
|
|
|
|
|
if ( ! construct.panel || '' === construct.panel() ) {
|
|
|
|
transitionParentPane = true;
|
|
|
|
} else if ( api.panel( construct.panel() ).contentContainer.hasClass( 'skip-transition' ) ) {
|
|
|
|
transitionParentPane = true;
|
|
|
|
} else {
|
|
|
|
transitionParentPane = false;
|
|
|
|
}
|
|
|
|
if ( transitionParentPane ) {
|
2016-09-23 18:23:30 -04:00
|
|
|
elements = elements.add( '#customize-info, .customize-pane-parent' );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle `transitionEnd` event.
|
|
|
|
transitionEndCallback = function( e ) {
|
|
|
|
if ( 2 !== e.eventPhase || ! $( e.target ).is( content ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
content.off( normalizedTransitionendEventName, transitionEndCallback );
|
|
|
|
elements.removeClass( 'busy' );
|
|
|
|
if ( completeCallback ) {
|
|
|
|
completeCallback();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
content.on( normalizedTransitionendEventName, transitionEndCallback );
|
|
|
|
elements.addClass( 'busy' );
|
|
|
|
|
|
|
|
// Prevent screen flicker when pane has been scrolled before expanding.
|
|
|
|
_.defer( function() {
|
|
|
|
var container = content.closest( '.wp-full-overlay-sidebar-content' ),
|
|
|
|
currentScrollTop = container.scrollTop(),
|
|
|
|
previousScrollTop = content.data( 'previous-scrollTop' ) || 0,
|
|
|
|
expanded = construct.expanded();
|
|
|
|
|
|
|
|
if ( expanded && 0 < currentScrollTop ) {
|
|
|
|
content.css( 'top', currentScrollTop + 'px' );
|
|
|
|
content.data( 'previous-scrollTop', currentScrollTop );
|
|
|
|
} else if ( ! expanded && 0 < currentScrollTop + previousScrollTop ) {
|
|
|
|
content.css( 'top', previousScrollTop - currentScrollTop + 'px' );
|
|
|
|
container.scrollTop( previousScrollTop );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
},
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
/**
|
|
|
|
* Bring the container into view and then expand this and bring it into view
|
|
|
|
* @param {Object} [params]
|
|
|
|
*/
|
2015-05-29 20:03:30 -04:00
|
|
|
focus: focus,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return the container html, generated from its JS template, if it exists.
|
|
|
|
*
|
|
|
|
* @since 4.3.0
|
|
|
|
*/
|
|
|
|
getContainer: function () {
|
|
|
|
var template,
|
|
|
|
container = this;
|
|
|
|
|
|
|
|
if ( 0 !== $( '#tmpl-' + container.templateSelector ).length ) {
|
|
|
|
template = wp.template( container.templateSelector );
|
2015-06-01 18:47:25 -04:00
|
|
|
} else {
|
|
|
|
template = wp.template( 'customize-' + container.containerType + '-default' );
|
|
|
|
}
|
|
|
|
if ( template && container.container ) {
|
|
|
|
return $.trim( template( container.params ) );
|
2015-05-29 20:03:30 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return '<li></li>';
|
2016-09-23 18:23:30 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find content element which is displayed when the section is expanded.
|
|
|
|
*
|
|
|
|
* After a construct is initialized, the return value will be available via the `contentContainer` property.
|
|
|
|
* By default the element will be related it to the parent container with `aria-owns` and detached.
|
|
|
|
* Custom panels and sections (such as the `NewMenuSection`) that do not have a sliding pane should
|
|
|
|
* just return the content element without needing to add the `aria-owns` element or detach it from
|
|
|
|
* the container. Such non-sliding pane custom sections also need to override the `onChangeExpanded`
|
|
|
|
* method to handle animating the panel/section into and out of view.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
2016-11-23 01:05:32 -05:00
|
|
|
* @access public
|
2016-09-23 18:23:30 -04:00
|
|
|
*
|
|
|
|
* @returns {jQuery} Detached content element.
|
|
|
|
*/
|
|
|
|
getContent: function() {
|
|
|
|
var construct = this,
|
|
|
|
container = construct.container,
|
|
|
|
content = container.find( '.accordion-section-content, .control-panel-content' ).first(),
|
|
|
|
contentId = 'sub-' + container.attr( 'id' ),
|
|
|
|
ownedElements = contentId,
|
|
|
|
alreadyOwnedElements = container.attr( 'aria-owns' );
|
|
|
|
|
|
|
|
if ( alreadyOwnedElements ) {
|
|
|
|
ownedElements = ownedElements + ' ' + alreadyOwnedElements;
|
|
|
|
}
|
|
|
|
container.attr( 'aria-owns', ownedElements );
|
|
|
|
|
|
|
|
return content.detach().attr( {
|
|
|
|
'id': contentId,
|
|
|
|
'class': 'customize-pane-child ' + content.attr( 'class' ) + ' ' + container.attr( 'class' )
|
|
|
|
} );
|
2015-05-29 20:03:30 -04:00
|
|
|
}
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
2014-11-11 18:52:22 -05:00
|
|
|
* @class
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
|
|
|
api.Section = Container.extend({
|
2015-05-29 20:03:30 -04:00
|
|
|
containerType: 'section',
|
2015-06-01 18:47:25 -04:00
|
|
|
defaults: {
|
|
|
|
title: '',
|
|
|
|
description: '',
|
|
|
|
priority: 100,
|
|
|
|
type: 'default',
|
|
|
|
content: null,
|
|
|
|
active: true,
|
|
|
|
instanceNumber: null,
|
|
|
|
panel: null,
|
|
|
|
customizeAction: ''
|
|
|
|
},
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
2015-06-01 18:47:25 -04:00
|
|
|
* @param {string} id - The ID for the section.
|
|
|
|
* @param {object} options - Object containing one property: params.
|
|
|
|
* @param {object} options.params - Object containing the following properties.
|
|
|
|
* @param {string} options.params.title - Title shown when section is collapsed and expanded.
|
|
|
|
* @param {string=} [options.params.description] - Description shown at the top of the section.
|
|
|
|
* @param {number=100} [options.params.priority] - The sort priority for the section.
|
|
|
|
* @param {string=default} [options.params.type] - The type of the section. See wp.customize.sectionConstructor.
|
|
|
|
* @param {string=} [options.params.content] - The markup to be used for the section container. If empty, a JS template is used.
|
|
|
|
* @param {boolean=true} [options.params.active] - Whether the section is active or not.
|
|
|
|
* @param {string} options.params.panel - The ID for the panel this section is associated with.
|
|
|
|
* @param {string=} [options.params.customizeAction] - Additional context information shown before the section title when expanded.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
initialize: function ( id, options ) {
|
|
|
|
var section = this;
|
|
|
|
Container.prototype.initialize.call( section, id, options );
|
|
|
|
|
|
|
|
section.id = id;
|
|
|
|
section.panel = new api.Value();
|
|
|
|
section.panel.bind( function ( id ) {
|
2016-09-23 18:23:30 -04:00
|
|
|
$( section.headContainer ).toggleClass( 'control-subsection', !! id );
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
section.panel.set( section.params.panel || '' );
|
2014-12-02 17:56:45 -05:00
|
|
|
api.utils.bubbleChildValueChanges( section, [ 'panel' ] );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
section.embed();
|
2014-12-02 17:56:45 -05:00
|
|
|
section.deferred.embedded.done( function () {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
section.ready();
|
|
|
|
});
|
|
|
|
},
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
/**
|
|
|
|
* Embed the container in the DOM when any parent panel is ready.
|
2014-12-03 21:04:22 -05:00
|
|
|
*
|
|
|
|
* @since 4.1.0
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
embed: function () {
|
2016-09-23 18:23:30 -04:00
|
|
|
var inject,
|
|
|
|
section = this,
|
|
|
|
container = $( '#customize-theme-controls' );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
// Watch for changes to the panel state
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
inject = function ( panelId ) {
|
|
|
|
var parentContainer;
|
|
|
|
if ( panelId ) {
|
2016-11-04 13:18:26 -04:00
|
|
|
// The panel has been supplied, so wait until the panel object is registered
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
api.panel( panelId, function ( panel ) {
|
2016-11-04 13:18:26 -04:00
|
|
|
// The panel has been registered, wait for it to become ready/initialized
|
2014-12-02 17:56:45 -05:00
|
|
|
panel.deferred.embedded.done( function () {
|
2016-09-23 18:23:30 -04:00
|
|
|
parentContainer = panel.contentContainer;
|
|
|
|
if ( ! section.headContainer.parent().is( parentContainer ) ) {
|
|
|
|
parentContainer.append( section.headContainer );
|
|
|
|
}
|
|
|
|
if ( ! section.contentContainer.parent().is( section.headContainer ) ) {
|
|
|
|
container.append( section.contentContainer );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
2014-12-02 17:56:45 -05:00
|
|
|
section.deferred.embedded.resolve();
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
});
|
|
|
|
} );
|
|
|
|
} else {
|
|
|
|
// There is no panel, so embed the section in the root of the customizer
|
2016-09-23 18:23:30 -04:00
|
|
|
parentContainer = $( '.customize-pane-parent' ); // @todo This should be defined elsewhere, and to be configurable
|
|
|
|
if ( ! section.headContainer.parent().is( parentContainer ) ) {
|
|
|
|
parentContainer.append( section.headContainer );
|
|
|
|
}
|
|
|
|
if ( ! section.contentContainer.parent().is( section.headContainer ) ) {
|
|
|
|
container.append( section.contentContainer );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
2014-12-02 17:56:45 -05:00
|
|
|
section.deferred.embedded.resolve();
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
};
|
|
|
|
section.panel.bind( inject );
|
2016-11-04 13:18:26 -04:00
|
|
|
inject( section.panel.get() ); // Since a section may never get a panel, assume that it won't ever get one
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
},
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* Add behaviors for the accordion section.
|
|
|
|
*
|
|
|
|
* @since 4.1.0
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
attachEvents: function () {
|
2016-10-19 14:15:31 -04:00
|
|
|
var meta, content, section = this;
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
2016-10-25 00:36:39 -04:00
|
|
|
if ( section.container.hasClass( 'cannot-expand' ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
// Expand/Collapse accordion sections on click.
|
2015-05-29 09:57:26 -04:00
|
|
|
section.container.find( '.accordion-section-title, .customize-section-back' ).on( 'click keydown', function( event ) {
|
2014-12-02 17:56:45 -05:00
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
event.preventDefault(); // Keep this AFTER the key filter above
|
|
|
|
|
|
|
|
if ( section.expanded() ) {
|
|
|
|
section.collapse();
|
|
|
|
} else {
|
|
|
|
section.expand();
|
|
|
|
}
|
|
|
|
});
|
2016-10-19 14:15:31 -04:00
|
|
|
|
|
|
|
// This is very similar to what is found for api.Panel.attachEvents().
|
|
|
|
section.container.find( '.customize-section-title .customize-help-toggle' ).on( 'click', function() {
|
|
|
|
|
|
|
|
meta = section.container.find( '.section-meta' );
|
|
|
|
if ( meta.hasClass( 'cannot-expand' ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
content = meta.find( '.customize-section-description:first' );
|
|
|
|
content.toggleClass( 'open' );
|
|
|
|
content.slideToggle();
|
|
|
|
content.attr( 'aria-expanded', function ( i, attr ) {
|
2016-11-23 01:05:32 -05:00
|
|
|
return 'true' === attr ? 'false' : 'true';
|
2016-10-19 14:15:31 -04:00
|
|
|
});
|
|
|
|
});
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return whether this section has any active controls.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
|
|
|
* @returns {Boolean}
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
isContextuallyActive: function () {
|
|
|
|
var section = this,
|
|
|
|
controls = section.controls(),
|
|
|
|
activeCount = 0;
|
|
|
|
_( controls ).each( function ( control ) {
|
|
|
|
if ( control.active() ) {
|
|
|
|
activeCount += 1;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
return ( activeCount !== 0 );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the controls that are associated with this section, sorted by their priority Value.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @returns {Array}
|
|
|
|
*/
|
|
|
|
controls: function () {
|
|
|
|
return this._children( 'section', 'control' );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* Update UI to reflect expanded state.
|
|
|
|
*
|
|
|
|
* @since 4.1.0
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*
|
|
|
|
* @param {Boolean} expanded
|
2014-12-03 21:04:22 -05:00
|
|
|
* @param {Object} args
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
onChangeExpanded: function ( expanded, args ) {
|
2015-08-11 19:56:25 -04:00
|
|
|
var section = this,
|
2016-09-23 18:23:30 -04:00
|
|
|
container = section.headContainer.closest( '.wp-full-overlay-sidebar-content' ),
|
|
|
|
content = section.contentContainer,
|
|
|
|
overlay = section.headContainer.closest( '.wp-full-overlay' ),
|
|
|
|
backBtn = content.find( '.customize-section-back' ),
|
|
|
|
sectionTitle = section.headContainer.find( '.accordion-section-title' ).first(),
|
2017-04-07 15:27:40 -04:00
|
|
|
expand, panel;
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
2016-09-23 18:23:30 -04:00
|
|
|
if ( expanded && ! content.hasClass( 'open' ) ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
|
|
|
if ( args.unchanged ) {
|
|
|
|
expand = args.completeCallback;
|
|
|
|
} else {
|
2016-09-23 18:23:30 -04:00
|
|
|
expand = $.proxy( function() {
|
|
|
|
section._animateChangeExpanded( function() {
|
|
|
|
sectionTitle.attr( 'tabindex', '-1' );
|
|
|
|
backBtn.attr( 'tabindex', '0' );
|
|
|
|
|
|
|
|
backBtn.focus();
|
|
|
|
content.css( 'top', '' );
|
|
|
|
container.scrollTop( 0 );
|
2015-08-11 19:56:25 -04:00
|
|
|
|
2016-09-23 18:23:30 -04:00
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
|
|
|
} );
|
2015-08-11 19:56:25 -04:00
|
|
|
|
2016-09-23 18:23:30 -04:00
|
|
|
content.addClass( 'open' );
|
|
|
|
overlay.addClass( 'section-open' );
|
2016-10-21 02:37:30 -04:00
|
|
|
api.state( 'expandedSection' ).set( section );
|
2016-09-23 18:23:30 -04:00
|
|
|
}, this );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( ! args.allowMultiple ) {
|
|
|
|
api.section.each( function ( otherSection ) {
|
|
|
|
if ( otherSection !== section ) {
|
|
|
|
otherSection.collapse( { duration: args.duration } );
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( section.panel() ) {
|
|
|
|
api.panel( section.panel() ).expand({
|
|
|
|
duration: args.duration,
|
|
|
|
completeCallback: expand
|
|
|
|
});
|
|
|
|
} else {
|
2015-08-31 19:08:42 -04:00
|
|
|
api.panel.each( function( panel ) {
|
|
|
|
panel.collapse();
|
|
|
|
});
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
expand();
|
|
|
|
}
|
|
|
|
|
2016-09-23 18:23:30 -04:00
|
|
|
} else if ( ! expanded && content.hasClass( 'open' ) ) {
|
2017-04-07 15:27:40 -04:00
|
|
|
if ( section.panel() ) {
|
|
|
|
panel = api.panel( section.panel() );
|
|
|
|
if ( panel.contentContainer.hasClass( 'skip-transition' ) ) {
|
|
|
|
panel.collapse();
|
|
|
|
}
|
|
|
|
}
|
2016-09-23 18:23:30 -04:00
|
|
|
section._animateChangeExpanded( function() {
|
|
|
|
backBtn.attr( 'tabindex', '-1' );
|
|
|
|
sectionTitle.attr( 'tabindex', '0' );
|
|
|
|
|
|
|
|
sectionTitle.focus();
|
|
|
|
content.css( 'top', '' );
|
|
|
|
|
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
content.removeClass( 'open' );
|
2015-05-29 09:57:26 -04:00
|
|
|
overlay.removeClass( 'section-open' );
|
2016-10-21 02:37:30 -04:00
|
|
|
if ( section === api.state( 'expandedSection' ).get() ) {
|
|
|
|
api.state( 'expandedSection' ).set( false );
|
|
|
|
}
|
2016-09-23 18:23:30 -04:00
|
|
|
|
2015-06-12 18:28:25 -04:00
|
|
|
} else {
|
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-02-24 15:31:24 -05:00
|
|
|
/**
|
|
|
|
* wp.customize.ThemesSection
|
|
|
|
*
|
2016-11-04 13:18:26 -04:00
|
|
|
* Custom section for themes that functions similarly to a backwards panel,
|
|
|
|
* and also handles the theme-details view rendering and navigation.
|
2015-02-24 15:31:24 -05:00
|
|
|
*
|
|
|
|
* @constructor
|
|
|
|
* @augments wp.customize.Section
|
|
|
|
* @augments wp.customize.Container
|
|
|
|
*/
|
|
|
|
api.ThemesSection = api.Section.extend({
|
|
|
|
currentTheme: '',
|
|
|
|
overlay: '',
|
|
|
|
template: '',
|
2015-04-08 16:52:29 -04:00
|
|
|
screenshotQueue: null,
|
|
|
|
$window: $( window ),
|
2015-04-13 18:10:29 -04:00
|
|
|
|
|
|
|
/**
|
2016-11-04 13:18:26 -04:00
|
|
|
* @since 4.2.0
|
2015-04-13 18:10:29 -04:00
|
|
|
*/
|
2016-11-04 13:18:26 -04:00
|
|
|
initialize: function () {
|
|
|
|
this.$customizeSidebar = $( '.wp-full-overlay-sidebar-content:first' );
|
|
|
|
return api.Section.prototype.initialize.apply( this, arguments );
|
2015-04-13 18:10:29 -04:00
|
|
|
},
|
2015-02-24 15:31:24 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
ready: function () {
|
|
|
|
var section = this;
|
|
|
|
section.overlay = section.container.find( '.theme-overlay' );
|
|
|
|
section.template = wp.template( 'customize-themes-details-view' );
|
|
|
|
|
|
|
|
// Bind global keyboard events.
|
2016-11-04 13:08:33 -04:00
|
|
|
section.container.on( 'keydown', function( event ) {
|
2015-02-24 15:31:24 -05:00
|
|
|
if ( ! section.overlay.find( '.theme-wrap' ).is( ':visible' ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pressing the right arrow key fires a theme:next event
|
|
|
|
if ( 39 === event.keyCode ) {
|
|
|
|
section.nextTheme();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pressing the left arrow key fires a theme:previous event
|
|
|
|
if ( 37 === event.keyCode ) {
|
|
|
|
section.previousTheme();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pressing the escape key fires a theme:collapse event
|
|
|
|
if ( 27 === event.keyCode ) {
|
|
|
|
section.closeDetails();
|
2016-11-04 13:08:33 -04:00
|
|
|
event.stopPropagation(); // Prevent section from being collapsed.
|
2015-02-24 15:31:24 -05:00
|
|
|
}
|
|
|
|
});
|
2015-04-08 16:52:29 -04:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
_.bindAll( this, 'renderScreenshots' );
|
2015-02-24 15:31:24 -05:00
|
|
|
},
|
|
|
|
|
2015-04-08 13:53:28 -04:00
|
|
|
/**
|
|
|
|
* Override Section.isContextuallyActive method.
|
|
|
|
*
|
|
|
|
* Ignore the active states' of the contained theme controls, and just
|
2016-11-04 13:18:26 -04:00
|
|
|
* use the section's own active state instead. This ensures empty search
|
|
|
|
* results for themes to cause the section to become inactive.
|
2015-04-08 13:53:28 -04:00
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*
|
|
|
|
* @returns {Boolean}
|
|
|
|
*/
|
|
|
|
isContextuallyActive: function () {
|
|
|
|
return this.active();
|
|
|
|
},
|
|
|
|
|
2015-02-24 15:31:24 -05:00
|
|
|
/**
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
attachEvents: function () {
|
2015-02-24 23:17:27 -05:00
|
|
|
var section = this;
|
2015-02-24 15:31:24 -05:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
// Expand/Collapse section/panel.
|
|
|
|
section.container.find( '.change-theme, .customize-theme' ).on( 'click keydown', function( event ) {
|
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
|
|
|
return;
|
2015-02-24 15:31:24 -05:00
|
|
|
}
|
2016-11-04 13:18:26 -04:00
|
|
|
event.preventDefault(); // Keep this AFTER the key filter above
|
2015-02-24 15:31:24 -05:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
if ( section.expanded() ) {
|
|
|
|
section.collapse();
|
|
|
|
} else {
|
|
|
|
section.expand();
|
2015-02-24 15:31:24 -05:00
|
|
|
}
|
2016-10-18 23:20:29 -04:00
|
|
|
});
|
2015-02-24 15:31:24 -05:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
// Theme navigation in details view.
|
|
|
|
section.container.on( 'click keydown', '.left', function( event ) {
|
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
|
|
|
return;
|
|
|
|
}
|
2015-02-24 15:31:24 -05:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
event.preventDefault(); // Keep this AFTER the key filter above
|
2015-02-24 15:31:24 -05:00
|
|
|
|
2016-10-18 23:20:29 -04:00
|
|
|
section.previousTheme();
|
|
|
|
});
|
2015-02-24 15:31:24 -05:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
section.container.on( 'click keydown', '.right', function( event ) {
|
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
event.preventDefault(); // Keep this AFTER the key filter above
|
|
|
|
|
2015-02-24 15:31:24 -05:00
|
|
|
section.nextTheme();
|
|
|
|
});
|
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
section.container.on( 'click keydown', '.theme-backdrop, .close', function( event ) {
|
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
event.preventDefault(); // Keep this AFTER the key filter above
|
|
|
|
|
2015-02-24 15:31:24 -05:00
|
|
|
section.closeDetails();
|
|
|
|
});
|
|
|
|
|
2015-04-08 16:52:29 -04:00
|
|
|
var renderScreenshots = _.throttle( _.bind( section.renderScreenshots, this ), 100 );
|
2016-11-04 13:18:26 -04:00
|
|
|
section.container.on( 'input', '#themes-filter', function( event ) {
|
2015-02-24 23:17:27 -05:00
|
|
|
var count,
|
|
|
|
term = event.currentTarget.value.toLowerCase().trim().replace( '-', ' ' ),
|
2015-02-24 15:31:24 -05:00
|
|
|
controls = section.controls();
|
2015-02-24 23:17:27 -05:00
|
|
|
|
2015-02-24 15:31:24 -05:00
|
|
|
_.each( controls, function( control ) {
|
|
|
|
control.filter( term );
|
|
|
|
});
|
2015-04-04 10:14:26 -04:00
|
|
|
|
2015-04-08 16:52:29 -04:00
|
|
|
renderScreenshots();
|
|
|
|
|
2015-04-04 10:14:26 -04:00
|
|
|
// Update theme count.
|
2016-11-04 13:18:26 -04:00
|
|
|
count = section.container.find( 'li.customize-control:visible' ).length;
|
|
|
|
section.container.find( '.theme-count' ).text( count );
|
2015-02-24 15:31:24 -05:00
|
|
|
});
|
2015-04-08 16:52:29 -04:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
// Pre-load the first 3 theme screenshots.
|
|
|
|
api.bind( 'ready', function () {
|
|
|
|
_.each( section.controls().slice( 0, 3 ), function ( control ) {
|
|
|
|
var img, src = control.params.theme.screenshot[0];
|
|
|
|
if ( src ) {
|
|
|
|
img = new Image();
|
|
|
|
img.src = src;
|
2015-04-08 16:52:29 -04:00
|
|
|
}
|
2016-10-18 23:20:29 -04:00
|
|
|
});
|
2015-04-08 16:52:29 -04:00
|
|
|
});
|
2015-02-24 15:31:24 -05:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update UI to reflect expanded state
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*
|
|
|
|
* @param {Boolean} expanded
|
|
|
|
* @param {Object} args
|
|
|
|
* @param {Boolean} args.unchanged
|
2016-11-04 13:18:26 -04:00
|
|
|
* @param {Callback} args.completeCallback
|
2015-02-24 15:31:24 -05:00
|
|
|
*/
|
|
|
|
onChangeExpanded: function ( expanded, args ) {
|
|
|
|
|
|
|
|
// Immediately call the complete callback if there were no changes
|
|
|
|
if ( args.unchanged ) {
|
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Note: there is a second argument 'args' passed
|
2016-11-04 13:18:26 -04:00
|
|
|
var panel = this,
|
|
|
|
section = panel.contentContainer,
|
|
|
|
overlay = section.closest( '.wp-full-overlay' ),
|
|
|
|
container = section.closest( '.wp-full-overlay-sidebar-content' ),
|
|
|
|
customizeBtn = section.find( '.customize-theme' ),
|
|
|
|
changeBtn = panel.headContainer.find( '.change-theme' );
|
2015-02-24 15:31:24 -05:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
if ( expanded && ! section.hasClass( 'current-panel' ) ) {
|
2015-02-24 15:31:24 -05:00
|
|
|
// Collapse any sibling sections/panels
|
|
|
|
api.section.each( function ( otherSection ) {
|
2016-11-04 13:18:26 -04:00
|
|
|
if ( otherSection !== panel ) {
|
2015-02-24 15:31:24 -05:00
|
|
|
otherSection.collapse( { duration: args.duration } );
|
|
|
|
}
|
|
|
|
});
|
2016-11-04 13:18:26 -04:00
|
|
|
api.panel.each( function ( otherPanel ) {
|
|
|
|
otherPanel.collapse( { duration: 0 } );
|
|
|
|
});
|
2015-02-24 15:31:24 -05:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
panel._animateChangeExpanded( function() {
|
|
|
|
changeBtn.attr( 'tabindex', '-1' );
|
|
|
|
customizeBtn.attr( 'tabindex', '0' );
|
2016-10-18 23:20:29 -04:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
customizeBtn.focus();
|
|
|
|
section.css( 'top', '' );
|
|
|
|
container.scrollTop( 0 );
|
2016-10-18 23:20:29 -04:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
2016-10-18 23:20:29 -04:00
|
|
|
}
|
2016-11-04 13:18:26 -04:00
|
|
|
} );
|
2016-10-18 23:20:29 -04:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
overlay.addClass( 'in-themes-panel' );
|
|
|
|
section.addClass( 'current-panel' );
|
2016-11-07 16:47:30 -05:00
|
|
|
_.delay( panel.renderScreenshots, 10 ); // Wait for the controls
|
|
|
|
panel.$customizeSidebar.on( 'scroll.customize-themes-section', _.throttle( panel.renderScreenshots, 300 ) );
|
2016-10-18 23:20:29 -04:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
} else if ( ! expanded && section.hasClass( 'current-panel' ) ) {
|
|
|
|
panel._animateChangeExpanded( function() {
|
|
|
|
changeBtn.attr( 'tabindex', '0' );
|
|
|
|
customizeBtn.attr( 'tabindex', '-1' );
|
2015-02-24 15:31:24 -05:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
changeBtn.focus();
|
|
|
|
section.css( 'top', '' );
|
2016-10-18 23:20:29 -04:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
|
|
|
} );
|
2016-10-18 23:20:29 -04:00
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
overlay.removeClass( 'in-themes-panel' );
|
|
|
|
section.removeClass( 'current-panel' );
|
2016-11-07 16:47:30 -05:00
|
|
|
panel.$customizeSidebar.off( 'scroll.customize-themes-section' );
|
2016-09-23 18:23:30 -04:00
|
|
|
}
|
2015-10-17 18:41:25 -04:00
|
|
|
},
|
|
|
|
|
2015-04-08 16:52:29 -04:00
|
|
|
/**
|
|
|
|
* Render control's screenshot if the control comes into view.
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
renderScreenshots: function( ) {
|
|
|
|
var section = this;
|
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
// Fill queue initially.
|
|
|
|
if ( section.screenshotQueue === null ) {
|
|
|
|
section.screenshotQueue = section.controls();
|
2015-04-08 16:52:29 -04:00
|
|
|
}
|
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
// Are all screenshots rendered?
|
2015-04-08 16:52:29 -04:00
|
|
|
if ( ! section.screenshotQueue.length ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
section.screenshotQueue = _.filter( section.screenshotQueue, function( control ) {
|
|
|
|
var $imageWrapper = control.container.find( '.theme-screenshot' ),
|
|
|
|
$image = $imageWrapper.find( 'img' );
|
|
|
|
|
|
|
|
if ( ! $image.length ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( $image.is( ':hidden' ) ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Based on unveil.js.
|
|
|
|
var wt = section.$window.scrollTop(),
|
|
|
|
wb = wt + section.$window.height(),
|
|
|
|
et = $image.offset().top,
|
|
|
|
ih = $imageWrapper.height(),
|
|
|
|
eb = et + ih,
|
|
|
|
threshold = ih * 3,
|
|
|
|
inView = eb >= wt - threshold && et <= wb + threshold;
|
|
|
|
|
|
|
|
if ( inView ) {
|
|
|
|
control.container.trigger( 'render-screenshot' );
|
|
|
|
}
|
|
|
|
|
|
|
|
// If the image is in view return false so it's cleared from the queue.
|
|
|
|
return ! inView;
|
|
|
|
} );
|
|
|
|
},
|
|
|
|
|
2015-02-24 15:31:24 -05:00
|
|
|
/**
|
|
|
|
* Advance the modal to the next theme.
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
nextTheme: function () {
|
|
|
|
var section = this;
|
|
|
|
if ( section.getNextTheme() ) {
|
|
|
|
section.showDetails( section.getNextTheme(), function() {
|
|
|
|
section.overlay.find( '.right' ).focus();
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the next theme model.
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
getNextTheme: function () {
|
2016-11-04 13:18:26 -04:00
|
|
|
var control, next;
|
|
|
|
control = api.control( 'theme_' + this.currentTheme );
|
2015-02-24 15:31:24 -05:00
|
|
|
next = control.container.next( 'li.customize-control-theme' );
|
|
|
|
if ( ! next.length ) {
|
|
|
|
return false;
|
|
|
|
}
|
2016-11-04 13:18:26 -04:00
|
|
|
next = next[0].id.replace( 'customize-control-', '' );
|
2015-02-24 15:31:24 -05:00
|
|
|
control = api.control( next );
|
|
|
|
|
|
|
|
return control.params.theme;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Advance the modal to the previous theme.
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
previousTheme: function () {
|
|
|
|
var section = this;
|
|
|
|
if ( section.getPreviousTheme() ) {
|
|
|
|
section.showDetails( section.getPreviousTheme(), function() {
|
|
|
|
section.overlay.find( '.left' ).focus();
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the previous theme model.
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
getPreviousTheme: function () {
|
2016-11-04 13:18:26 -04:00
|
|
|
var control, previous;
|
|
|
|
control = api.control( 'theme_' + this.currentTheme );
|
2015-02-24 15:31:24 -05:00
|
|
|
previous = control.container.prev( 'li.customize-control-theme' );
|
|
|
|
if ( ! previous.length ) {
|
|
|
|
return false;
|
|
|
|
}
|
2016-11-04 13:18:26 -04:00
|
|
|
previous = previous[0].id.replace( 'customize-control-', '' );
|
2015-02-24 15:31:24 -05:00
|
|
|
control = api.control( previous );
|
|
|
|
|
|
|
|
return control.params.theme;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Disable buttons when we're viewing the first or last theme.
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
updateLimits: function () {
|
|
|
|
if ( ! this.getNextTheme() ) {
|
|
|
|
this.overlay.find( '.right' ).addClass( 'disabled' );
|
|
|
|
}
|
|
|
|
if ( ! this.getPreviousTheme() ) {
|
|
|
|
this.overlay.find( '.left' ).addClass( 'disabled' );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2016-11-04 13:18:26 -04:00
|
|
|
/**
|
|
|
|
* Load theme preview.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
2016-11-23 01:05:32 -05:00
|
|
|
* @access public
|
2016-11-04 13:18:26 -04:00
|
|
|
*
|
|
|
|
* @param {string} themeId Theme ID.
|
|
|
|
* @returns {jQuery.promise} Promise.
|
|
|
|
*/
|
|
|
|
loadThemePreview: function( themeId ) {
|
|
|
|
var deferred = $.Deferred(), onceProcessingComplete, overlay, urlParser;
|
|
|
|
|
|
|
|
urlParser = document.createElement( 'a' );
|
|
|
|
urlParser.href = location.href;
|
|
|
|
urlParser.search = $.param( _.extend(
|
|
|
|
api.utils.parseQueryString( urlParser.search.substr( 1 ) ),
|
|
|
|
{
|
|
|
|
theme: themeId,
|
|
|
|
changeset_uuid: api.settings.changeset.uuid
|
|
|
|
}
|
|
|
|
) );
|
|
|
|
|
|
|
|
overlay = $( '.wp-full-overlay' );
|
|
|
|
overlay.addClass( 'customize-loading' );
|
|
|
|
|
|
|
|
onceProcessingComplete = function() {
|
|
|
|
var request;
|
|
|
|
if ( api.state( 'processing' ).get() > 0 ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
api.state( 'processing' ).unbind( onceProcessingComplete );
|
|
|
|
|
|
|
|
request = api.requestChangesetUpdate();
|
|
|
|
request.done( function() {
|
|
|
|
$( window ).off( 'beforeunload.customize-confirm' );
|
2016-11-16 17:17:29 -05:00
|
|
|
top.location.href = urlParser.href;
|
2016-11-23 01:05:32 -05:00
|
|
|
deferred.resolve();
|
2016-11-04 13:18:26 -04:00
|
|
|
} );
|
|
|
|
request.fail( function() {
|
|
|
|
overlay.removeClass( 'customize-loading' );
|
2016-11-23 01:05:32 -05:00
|
|
|
deferred.reject();
|
2016-11-04 13:18:26 -04:00
|
|
|
} );
|
|
|
|
};
|
|
|
|
|
|
|
|
if ( 0 === api.state( 'processing' ).get() ) {
|
|
|
|
onceProcessingComplete();
|
|
|
|
} else {
|
|
|
|
api.state( 'processing' ).bind( onceProcessingComplete );
|
|
|
|
}
|
|
|
|
|
|
|
|
return deferred.promise();
|
|
|
|
},
|
|
|
|
|
2015-02-24 15:31:24 -05:00
|
|
|
/**
|
|
|
|
* Render & show the theme details for a given theme model.
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*
|
|
|
|
* @param {Object} theme
|
|
|
|
*/
|
|
|
|
showDetails: function ( theme, callback ) {
|
2016-11-04 13:18:26 -04:00
|
|
|
var section = this, link;
|
2015-02-24 15:31:24 -05:00
|
|
|
callback = callback || function(){};
|
|
|
|
section.currentTheme = theme.id;
|
|
|
|
section.overlay.html( section.template( theme ) )
|
2015-04-08 16:52:29 -04:00
|
|
|
.fadeIn( 'fast' )
|
|
|
|
.focus();
|
2015-02-24 15:31:24 -05:00
|
|
|
$( 'body' ).addClass( 'modal-open' );
|
|
|
|
section.containFocus( section.overlay );
|
|
|
|
section.updateLimits();
|
2016-11-04 13:18:26 -04:00
|
|
|
|
|
|
|
link = section.overlay.find( '.inactive-theme > a' );
|
|
|
|
|
|
|
|
link.on( 'click', function( event ) {
|
|
|
|
event.preventDefault();
|
|
|
|
|
|
|
|
// Short-circuit if request is currently being made.
|
|
|
|
if ( link.hasClass( 'disabled' ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
link.addClass( 'disabled' );
|
|
|
|
|
|
|
|
section.loadThemePreview( theme.id ).fail( function() {
|
|
|
|
link.removeClass( 'disabled' );
|
|
|
|
} );
|
|
|
|
} );
|
2015-02-24 15:31:24 -05:00
|
|
|
callback();
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Close the theme details modal.
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
2015-02-24 23:17:27 -05:00
|
|
|
closeDetails: function () {
|
2015-02-24 15:31:24 -05:00
|
|
|
$( 'body' ).removeClass( 'modal-open' );
|
|
|
|
this.overlay.fadeOut( 'fast' );
|
2016-11-04 13:18:26 -04:00
|
|
|
api.control( 'theme_' + this.currentTheme ).focus();
|
2015-02-24 15:31:24 -05:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Keep tab focus within the theme details modal.
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
containFocus: function( el ) {
|
|
|
|
var tabbables;
|
|
|
|
|
|
|
|
el.on( 'keydown', function( event ) {
|
|
|
|
|
|
|
|
// Return if it's not the tab key
|
|
|
|
// When navigating with prev/next focus is already handled
|
|
|
|
if ( 9 !== event.keyCode ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// uses jQuery UI to get the tabbable elements
|
|
|
|
tabbables = $( ':tabbable', el );
|
|
|
|
|
|
|
|
// Keep focus within the overlay
|
|
|
|
if ( tabbables.last()[0] === event.target && ! event.shiftKey ) {
|
|
|
|
tabbables.first().focus();
|
|
|
|
return false;
|
|
|
|
} else if ( tabbables.first()[0] === event.target && event.shiftKey ) {
|
|
|
|
tabbables.last().focus();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
2014-11-11 18:52:22 -05:00
|
|
|
* @class
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
|
|
|
api.Panel = Container.extend({
|
2015-05-29 20:03:30 -04:00
|
|
|
containerType: 'panel',
|
|
|
|
|
2014-12-03 21:04:22 -05:00
|
|
|
/**
|
|
|
|
* @since 4.1.0
|
|
|
|
*
|
2015-06-01 18:47:25 -04:00
|
|
|
* @param {string} id - The ID for the panel.
|
|
|
|
* @param {object} options - Object containing one property: params.
|
|
|
|
* @param {object} options.params - Object containing the following properties.
|
|
|
|
* @param {string} options.params.title - Title shown when panel is collapsed and expanded.
|
|
|
|
* @param {string=} [options.params.description] - Description shown at the top of the panel.
|
|
|
|
* @param {number=100} [options.params.priority] - The sort priority for the panel.
|
|
|
|
* @param {string=default} [options.params.type] - The type of the panel. See wp.customize.panelConstructor.
|
|
|
|
* @param {string=} [options.params.content] - The markup to be used for the panel container. If empty, a JS template is used.
|
|
|
|
* @param {boolean=true} [options.params.active] - Whether the panel is active or not.
|
2014-12-03 21:04:22 -05:00
|
|
|
*/
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
initialize: function ( id, options ) {
|
|
|
|
var panel = this;
|
|
|
|
Container.prototype.initialize.call( panel, id, options );
|
|
|
|
panel.embed();
|
2014-12-02 17:56:45 -05:00
|
|
|
panel.deferred.embedded.done( function () {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
panel.ready();
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Embed the container in the DOM when any parent panel is ready.
|
2014-12-03 21:04:22 -05:00
|
|
|
*
|
|
|
|
* @since 4.1.0
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
embed: function () {
|
|
|
|
var panel = this,
|
2016-09-23 18:23:30 -04:00
|
|
|
container = $( '#customize-theme-controls' ),
|
|
|
|
parentContainer = $( '.customize-pane-parent' ); // @todo This should be defined elsewhere, and to be configurable
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
2016-09-23 18:23:30 -04:00
|
|
|
if ( ! panel.headContainer.parent().is( parentContainer ) ) {
|
|
|
|
parentContainer.append( panel.headContainer );
|
|
|
|
}
|
|
|
|
if ( ! panel.contentContainer.parent().is( panel.headContainer ) ) {
|
|
|
|
container.append( panel.contentContainer );
|
2016-11-04 13:18:26 -04:00
|
|
|
panel.renderContent();
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
2015-10-16 19:48:25 -04:00
|
|
|
|
2014-12-02 17:56:45 -05:00
|
|
|
panel.deferred.embedded.resolve();
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
attachEvents: function () {
|
|
|
|
var meta, panel = this;
|
|
|
|
|
|
|
|
// Expand/Collapse accordion sections on click.
|
2016-09-23 18:23:30 -04:00
|
|
|
panel.headContainer.find( '.accordion-section-title' ).on( 'click keydown', function( event ) {
|
2014-12-02 17:56:45 -05:00
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
event.preventDefault(); // Keep this AFTER the key filter above
|
|
|
|
|
|
|
|
if ( ! panel.expanded() ) {
|
|
|
|
panel.expand();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-05-29 09:57:26 -04:00
|
|
|
// Close panel.
|
|
|
|
panel.container.find( '.customize-panel-back' ).on( 'click keydown', function( event ) {
|
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
event.preventDefault(); // Keep this AFTER the key filter above
|
|
|
|
|
|
|
|
if ( panel.expanded() ) {
|
|
|
|
panel.collapse();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
meta = panel.container.find( '.panel-meta:first' );
|
|
|
|
|
2015-05-29 09:57:26 -04:00
|
|
|
meta.find( '> .accordion-section-title .customize-help-toggle' ).on( 'click keydown', function( event ) {
|
2014-12-02 17:56:45 -05:00
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
event.preventDefault(); // Keep this AFTER the key filter above
|
|
|
|
|
|
|
|
if ( meta.hasClass( 'cannot-expand' ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-05-29 09:57:26 -04:00
|
|
|
var content = meta.find( '.customize-panel-description:first' );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
if ( meta.hasClass( 'open' ) ) {
|
|
|
|
meta.toggleClass( 'open' );
|
|
|
|
content.slideUp( panel.defaultExpandedArguments.duration );
|
2015-05-29 09:57:26 -04:00
|
|
|
$( this ).attr( 'aria-expanded', false );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
} else {
|
|
|
|
content.slideDown( panel.defaultExpandedArguments.duration );
|
|
|
|
meta.toggleClass( 'open' );
|
2015-05-29 09:57:26 -04:00
|
|
|
$( this ).attr( 'aria-expanded', true );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the sections that are associated with this panel, sorted by their priority Value.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @returns {Array}
|
|
|
|
*/
|
|
|
|
sections: function () {
|
|
|
|
return this._children( 'panel', 'section' );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return whether this panel has any active sections.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @returns {boolean}
|
|
|
|
*/
|
|
|
|
isContextuallyActive: function () {
|
|
|
|
var panel = this,
|
|
|
|
sections = panel.sections(),
|
|
|
|
activeCount = 0;
|
|
|
|
_( sections ).each( function ( section ) {
|
|
|
|
if ( section.active() && section.isContextuallyActive() ) {
|
|
|
|
activeCount += 1;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
return ( activeCount !== 0 );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update UI to reflect expanded state
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
|
|
|
* @param {Boolean} expanded
|
|
|
|
* @param {Object} args
|
|
|
|
* @param {Boolean} args.unchanged
|
2015-10-16 19:48:25 -04:00
|
|
|
* @param {Function} args.completeCallback
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
onChangeExpanded: function ( expanded, args ) {
|
|
|
|
|
|
|
|
// Immediately call the complete callback if there were no changes
|
|
|
|
if ( args.unchanged ) {
|
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Note: there is a second argument 'args' passed
|
2016-09-23 18:23:30 -04:00
|
|
|
var panel = this,
|
|
|
|
accordionSection = panel.contentContainer,
|
2015-10-16 19:48:25 -04:00
|
|
|
overlay = accordionSection.closest( '.wp-full-overlay' ),
|
|
|
|
container = accordionSection.closest( '.wp-full-overlay-sidebar-content' ),
|
2016-09-23 18:23:30 -04:00
|
|
|
topPanel = panel.headContainer.find( '.accordion-section-title' ),
|
2017-04-07 15:27:40 -04:00
|
|
|
backBtn = accordionSection.find( '.customize-panel-back' ),
|
|
|
|
childSections = panel.sections(),
|
|
|
|
skipTransition;
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
2016-09-23 18:23:30 -04:00
|
|
|
if ( expanded && ! accordionSection.hasClass( 'current-panel' ) ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
// Collapse any sibling sections/panels
|
|
|
|
api.section.each( function ( section ) {
|
2015-08-31 19:08:42 -04:00
|
|
|
if ( panel.id !== section.panel() ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
section.collapse( { duration: 0 } );
|
|
|
|
}
|
|
|
|
});
|
|
|
|
api.panel.each( function ( otherPanel ) {
|
|
|
|
if ( panel !== otherPanel ) {
|
|
|
|
otherPanel.collapse( { duration: 0 } );
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2017-04-07 15:27:40 -04:00
|
|
|
if ( panel.params.autoExpandSoleSection && 1 === childSections.length && childSections[0].active.get() ) {
|
|
|
|
accordionSection.addClass( 'current-panel skip-transition' );
|
|
|
|
overlay.addClass( 'in-sub-panel' );
|
2016-09-23 18:23:30 -04:00
|
|
|
|
2017-04-07 15:27:40 -04:00
|
|
|
childSections[0].expand( {
|
|
|
|
completeCallback: args.completeCallback
|
|
|
|
} );
|
|
|
|
} else {
|
|
|
|
panel._animateChangeExpanded( function() {
|
|
|
|
topPanel.attr( 'tabindex', '-1' );
|
|
|
|
backBtn.attr( 'tabindex', '0' );
|
2016-09-23 18:23:30 -04:00
|
|
|
|
2017-04-07 15:27:40 -04:00
|
|
|
backBtn.focus();
|
|
|
|
accordionSection.css( 'top', '' );
|
|
|
|
container.scrollTop( 0 );
|
|
|
|
|
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
accordionSection.addClass( 'current-panel' );
|
|
|
|
overlay.addClass( 'in-sub-panel' );
|
|
|
|
}
|
2016-09-23 18:23:30 -04:00
|
|
|
|
2016-10-21 02:37:30 -04:00
|
|
|
api.state( 'expandedPanel' ).set( panel );
|
2016-09-23 18:23:30 -04:00
|
|
|
|
|
|
|
} else if ( ! expanded && accordionSection.hasClass( 'current-panel' ) ) {
|
2017-04-07 15:27:40 -04:00
|
|
|
skipTransition = accordionSection.hasClass( 'skip-transition' );
|
|
|
|
if ( ! skipTransition ) {
|
|
|
|
panel._animateChangeExpanded( function() {
|
|
|
|
topPanel.attr( 'tabindex', '0' );
|
|
|
|
backBtn.attr( 'tabindex', '-1' );
|
2016-09-23 18:23:30 -04:00
|
|
|
|
2017-04-07 15:27:40 -04:00
|
|
|
topPanel.focus();
|
|
|
|
accordionSection.css( 'top', '' );
|
2016-09-23 18:23:30 -04:00
|
|
|
|
2017-04-07 15:27:40 -04:00
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
} else {
|
|
|
|
accordionSection.removeClass( 'skip-transition' );
|
|
|
|
}
|
2015-05-29 20:03:30 -04:00
|
|
|
|
2016-09-23 18:23:30 -04:00
|
|
|
overlay.removeClass( 'in-sub-panel' );
|
|
|
|
accordionSection.removeClass( 'current-panel' );
|
2016-10-21 02:37:30 -04:00
|
|
|
if ( panel === api.state( 'expandedPanel' ).get() ) {
|
|
|
|
api.state( 'expandedPanel' ).set( false );
|
|
|
|
}
|
2016-09-23 18:23:30 -04:00
|
|
|
}
|
2015-10-16 19:48:25 -04:00
|
|
|
},
|
|
|
|
|
2015-05-29 20:03:30 -04:00
|
|
|
/**
|
|
|
|
* Render the panel from its JS template, if it exists.
|
|
|
|
*
|
|
|
|
* The panel's container must already exist in the DOM.
|
|
|
|
*
|
|
|
|
* @since 4.3.0
|
|
|
|
*/
|
|
|
|
renderContent: function () {
|
|
|
|
var template,
|
|
|
|
panel = this;
|
|
|
|
|
|
|
|
// Add the content to the container.
|
|
|
|
if ( 0 !== $( '#tmpl-' + panel.templateSelector + '-content' ).length ) {
|
|
|
|
template = wp.template( panel.templateSelector + '-content' );
|
2015-06-01 18:47:25 -04:00
|
|
|
} else {
|
|
|
|
template = wp.template( 'customize-panel-default-content' );
|
|
|
|
}
|
2016-09-23 18:23:30 -04:00
|
|
|
if ( template && panel.headContainer ) {
|
|
|
|
panel.contentContainer.html( template( panel.params ) );
|
2015-05-29 20:03:30 -04:00
|
|
|
}
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
2014-11-11 18:52:22 -05:00
|
|
|
* A Customizer Control.
|
|
|
|
*
|
|
|
|
* A control provides a UI element that allows a user to modify a Customizer Setting.
|
|
|
|
*
|
|
|
|
* @see PHP class WP_Customize_Control.
|
|
|
|
*
|
|
|
|
* @class
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @augments wp.customize.Class
|
2014-11-11 18:52:22 -05:00
|
|
|
*
|
2015-09-05 15:53:24 -04:00
|
|
|
* @param {string} id Unique identifier for the control instance.
|
|
|
|
* @param {object} options Options hash for the control instance.
|
2014-11-11 18:52:22 -05:00
|
|
|
* @param {object} options.params
|
2015-09-05 15:53:24 -04:00
|
|
|
* @param {object} options.params.type Type of control (e.g. text, radio, dropdown-pages, etc.)
|
|
|
|
* @param {string} options.params.content The HTML content for the control.
|
|
|
|
* @param {string} options.params.priority Order of priority to show the control within the section.
|
2014-11-11 18:52:22 -05:00
|
|
|
* @param {string} options.params.active
|
2015-09-05 15:53:24 -04:00
|
|
|
* @param {string} options.params.section The ID of the section the control belongs to.
|
|
|
|
* @param {string} options.params.settings.default The ID of the setting the control relates to.
|
|
|
|
* @param {string} options.params.settings.data
|
2014-11-11 18:52:22 -05:00
|
|
|
* @param {string} options.params.label
|
|
|
|
* @param {string} options.params.description
|
|
|
|
* @param {string} options.params.instanceNumber Order in which this instance was created in relation to other instances.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
api.Control = api.Class.extend({
|
2014-11-11 17:37:22 -05:00
|
|
|
defaultActiveArguments: { duration: 'fast', completeCallback: $.noop },
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
|
|
|
initialize: function( id, options ) {
|
|
|
|
var control = this,
|
|
|
|
nodes, radios, settings;
|
|
|
|
|
|
|
|
control.params = {};
|
|
|
|
$.extend( control, options || {} );
|
|
|
|
control.id = id;
|
|
|
|
control.selector = '#customize-control-' + id.replace( /\]/g, '' ).replace( /\[/g, '-' );
|
|
|
|
control.templateSelector = 'customize-control-' + control.params.type + '-content';
|
|
|
|
control.container = control.params.content ? $( control.params.content ) : $( control.selector );
|
|
|
|
|
|
|
|
control.deferred = {
|
2014-12-02 17:56:45 -05:00
|
|
|
embedded: new $.Deferred()
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
};
|
|
|
|
control.section = new api.Value();
|
|
|
|
control.priority = new api.Value();
|
|
|
|
control.active = new api.Value();
|
|
|
|
control.activeArgumentsQueue = [];
|
Customize: Add setting validation model and control notifications to augment setting sanitization.
When a setting is invalid, not only will it be blocked from being saved but all other settings will be blocked as well. This ensures that Customizer saves aren't partial but are more transactional. User will be displayed the error in a notification so that they can fix and re-attempt saving.
PHP changes:
* Introduces `WP_Customize_Setting::validate()`, `WP_Customize_Setting::$validate_callback`, and the `customize_validate_{$setting_id}` filter.
* Introduces `WP_Customize_Manager::validate_setting_values()` to do validation (and sanitization) for the setting values supplied, returning a list of `WP_Error` instances for invalid settings.
* Attempting to save settings that are invalid will result in the save being blocked entirely, with the errors being sent in the `customize_save_response`. Modifies `WP_Customize_Manager::save()` to check all settings for validity issues prior to calling their `save` methods.
* Introduces `WP_Customize_Setting::json()` for parity with the other Customizer classes. This includes exporting of the `type`.
* Modifies `WP_Customize_Manager::post_value()` to apply `validate` after `sanitize`, and if validation fails, to return the `$default`.
* Introduces `customize_save_validation_before` action which fires right before the validation checks are made prior to saving.
JS changes:
* Introduces `wp.customize.Notification` in JS which to represent `WP_Error` instances returned from the server when setting validation fails.
* Introduces `wp.customize.Setting.prototype.notifications`.
* Introduces `wp.customize.Control.prototype.notifications`, which are synced with a control's settings' notifications.
* Introduces `wp.customize.Control.prototype.renderNotifications()` to re-render a control's notifications in its notification area. This is called automatically when the notifications collection changes.
* Introduces `wp.customize.settingConstructor`, allowing custom setting types to be used in the same way that custom controls, panels, and sections can be made.
* Injects a notification area into existing controls which is populated in response to the control's `notifications` collection changing. A custom control can customize the placement of the notification area by overriding the new `getNotificationsContainerElement` method.
* When a save fails due to setting invalidity, the invalidity errors will be added to the settings to then populate in the controls' notification areas, and the first such invalid control will be focused.
Props westonruter, celloexpressions, mrahmadawais.
See #35210.
See #30937.
Fixes #34893.
Built from https://develop.svn.wordpress.org/trunk@37476
git-svn-id: http://core.svn.wordpress.org/trunk@37444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-20 17:10:27 -04:00
|
|
|
control.notifications = new api.Values({ defaultConstructor: api.Notification });
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
control.elements = [];
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
nodes = control.container.find('[data-customize-setting-link]');
|
2012-08-22 20:04:18 -04:00
|
|
|
radios = {};
|
|
|
|
|
|
|
|
nodes.each( function() {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
var node = $( this ),
|
2012-08-22 20:04:18 -04:00
|
|
|
name;
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
if ( node.is( ':radio' ) ) {
|
|
|
|
name = node.prop( 'name' );
|
|
|
|
if ( radios[ name ] ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
return;
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
radios[ name ] = true;
|
|
|
|
node = nodes.filter( '[name="' + name + '"]' );
|
|
|
|
}
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
api( node.data( 'customizeSettingLink' ), function( setting ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
var element = new api.Element( node );
|
|
|
|
control.elements.push( element );
|
|
|
|
element.sync( setting );
|
|
|
|
element.set( setting() );
|
|
|
|
});
|
|
|
|
});
|
2014-07-09 19:58:16 -04:00
|
|
|
|
|
|
|
control.active.bind( function ( active ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
var args = control.activeArgumentsQueue.shift();
|
|
|
|
args = $.extend( {}, control.defaultActiveArguments, args );
|
|
|
|
control.onChangeActive( active, args );
|
2014-07-09 19:58:16 -04:00
|
|
|
} );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
|
|
|
control.section.set( control.params.section );
|
|
|
|
control.priority.set( isNaN( control.params.priority ) ? 10 : control.params.priority );
|
|
|
|
control.active.set( control.params.active );
|
|
|
|
|
2014-12-02 17:56:45 -05:00
|
|
|
api.utils.bubbleChildValueChanges( control, [ 'section', 'priority', 'active' ] );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
2015-09-05 15:53:24 -04:00
|
|
|
/*
|
|
|
|
* After all settings related to the control are available,
|
|
|
|
* make them available on the control and embed the control into the page.
|
|
|
|
*/
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
settings = $.map( control.params.settings, function( value ) {
|
|
|
|
return value;
|
|
|
|
});
|
|
|
|
|
2016-02-24 13:28:28 -05:00
|
|
|
if ( 0 === settings.length ) {
|
|
|
|
control.setting = null;
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
control.settings = {};
|
2016-02-24 13:28:28 -05:00
|
|
|
control.embed();
|
|
|
|
} else {
|
|
|
|
api.apply( api, settings.concat( function() {
|
|
|
|
var key;
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
2016-02-24 13:28:28 -05:00
|
|
|
control.settings = {};
|
|
|
|
for ( key in control.params.settings ) {
|
|
|
|
control.settings[ key ] = api( control.params.settings[ key ] );
|
|
|
|
}
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
2016-02-24 13:28:28 -05:00
|
|
|
control.setting = control.settings['default'] || null;
|
|
|
|
|
2016-06-14 15:17:28 -04:00
|
|
|
// Add setting notifications to the control notification.
|
Customize: Add setting validation model and control notifications to augment setting sanitization.
When a setting is invalid, not only will it be blocked from being saved but all other settings will be blocked as well. This ensures that Customizer saves aren't partial but are more transactional. User will be displayed the error in a notification so that they can fix and re-attempt saving.
PHP changes:
* Introduces `WP_Customize_Setting::validate()`, `WP_Customize_Setting::$validate_callback`, and the `customize_validate_{$setting_id}` filter.
* Introduces `WP_Customize_Manager::validate_setting_values()` to do validation (and sanitization) for the setting values supplied, returning a list of `WP_Error` instances for invalid settings.
* Attempting to save settings that are invalid will result in the save being blocked entirely, with the errors being sent in the `customize_save_response`. Modifies `WP_Customize_Manager::save()` to check all settings for validity issues prior to calling their `save` methods.
* Introduces `WP_Customize_Setting::json()` for parity with the other Customizer classes. This includes exporting of the `type`.
* Modifies `WP_Customize_Manager::post_value()` to apply `validate` after `sanitize`, and if validation fails, to return the `$default`.
* Introduces `customize_save_validation_before` action which fires right before the validation checks are made prior to saving.
JS changes:
* Introduces `wp.customize.Notification` in JS which to represent `WP_Error` instances returned from the server when setting validation fails.
* Introduces `wp.customize.Setting.prototype.notifications`.
* Introduces `wp.customize.Control.prototype.notifications`, which are synced with a control's settings' notifications.
* Introduces `wp.customize.Control.prototype.renderNotifications()` to re-render a control's notifications in its notification area. This is called automatically when the notifications collection changes.
* Introduces `wp.customize.settingConstructor`, allowing custom setting types to be used in the same way that custom controls, panels, and sections can be made.
* Injects a notification area into existing controls which is populated in response to the control's `notifications` collection changing. A custom control can customize the placement of the notification area by overriding the new `getNotificationsContainerElement` method.
* When a save fails due to setting invalidity, the invalidity errors will be added to the settings to then populate in the controls' notification areas, and the first such invalid control will be focused.
Props westonruter, celloexpressions, mrahmadawais.
See #35210.
See #30937.
Fixes #34893.
Built from https://develop.svn.wordpress.org/trunk@37476
git-svn-id: http://core.svn.wordpress.org/trunk@37444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-20 17:10:27 -04:00
|
|
|
_.each( control.settings, function( setting ) {
|
|
|
|
setting.notifications.bind( 'add', function( settingNotification ) {
|
2016-06-14 15:17:28 -04:00
|
|
|
var controlNotification, code, params;
|
|
|
|
code = setting.id + ':' + settingNotification.code;
|
|
|
|
params = _.extend(
|
|
|
|
{},
|
|
|
|
settingNotification,
|
|
|
|
{
|
|
|
|
setting: setting.id
|
|
|
|
}
|
|
|
|
);
|
|
|
|
controlNotification = new api.Notification( code, params );
|
Customize: Add setting validation model and control notifications to augment setting sanitization.
When a setting is invalid, not only will it be blocked from being saved but all other settings will be blocked as well. This ensures that Customizer saves aren't partial but are more transactional. User will be displayed the error in a notification so that they can fix and re-attempt saving.
PHP changes:
* Introduces `WP_Customize_Setting::validate()`, `WP_Customize_Setting::$validate_callback`, and the `customize_validate_{$setting_id}` filter.
* Introduces `WP_Customize_Manager::validate_setting_values()` to do validation (and sanitization) for the setting values supplied, returning a list of `WP_Error` instances for invalid settings.
* Attempting to save settings that are invalid will result in the save being blocked entirely, with the errors being sent in the `customize_save_response`. Modifies `WP_Customize_Manager::save()` to check all settings for validity issues prior to calling their `save` methods.
* Introduces `WP_Customize_Setting::json()` for parity with the other Customizer classes. This includes exporting of the `type`.
* Modifies `WP_Customize_Manager::post_value()` to apply `validate` after `sanitize`, and if validation fails, to return the `$default`.
* Introduces `customize_save_validation_before` action which fires right before the validation checks are made prior to saving.
JS changes:
* Introduces `wp.customize.Notification` in JS which to represent `WP_Error` instances returned from the server when setting validation fails.
* Introduces `wp.customize.Setting.prototype.notifications`.
* Introduces `wp.customize.Control.prototype.notifications`, which are synced with a control's settings' notifications.
* Introduces `wp.customize.Control.prototype.renderNotifications()` to re-render a control's notifications in its notification area. This is called automatically when the notifications collection changes.
* Introduces `wp.customize.settingConstructor`, allowing custom setting types to be used in the same way that custom controls, panels, and sections can be made.
* Injects a notification area into existing controls which is populated in response to the control's `notifications` collection changing. A custom control can customize the placement of the notification area by overriding the new `getNotificationsContainerElement` method.
* When a save fails due to setting invalidity, the invalidity errors will be added to the settings to then populate in the controls' notification areas, and the first such invalid control will be focused.
Props westonruter, celloexpressions, mrahmadawais.
See #35210.
See #30937.
Fixes #34893.
Built from https://develop.svn.wordpress.org/trunk@37476
git-svn-id: http://core.svn.wordpress.org/trunk@37444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-20 17:10:27 -04:00
|
|
|
control.notifications.add( controlNotification.code, controlNotification );
|
|
|
|
} );
|
|
|
|
setting.notifications.bind( 'remove', function( settingNotification ) {
|
|
|
|
control.notifications.remove( setting.id + ':' + settingNotification.code );
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
2016-02-24 13:28:28 -05:00
|
|
|
control.embed();
|
|
|
|
}) );
|
|
|
|
}
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
2015-09-05 15:53:24 -04:00
|
|
|
// After the control is embedded on the page, invoke the "ready" method.
|
2014-12-02 17:56:45 -05:00
|
|
|
control.deferred.embedded.done( function () {
|
Customize: Add setting validation model and control notifications to augment setting sanitization.
When a setting is invalid, not only will it be blocked from being saved but all other settings will be blocked as well. This ensures that Customizer saves aren't partial but are more transactional. User will be displayed the error in a notification so that they can fix and re-attempt saving.
PHP changes:
* Introduces `WP_Customize_Setting::validate()`, `WP_Customize_Setting::$validate_callback`, and the `customize_validate_{$setting_id}` filter.
* Introduces `WP_Customize_Manager::validate_setting_values()` to do validation (and sanitization) for the setting values supplied, returning a list of `WP_Error` instances for invalid settings.
* Attempting to save settings that are invalid will result in the save being blocked entirely, with the errors being sent in the `customize_save_response`. Modifies `WP_Customize_Manager::save()` to check all settings for validity issues prior to calling their `save` methods.
* Introduces `WP_Customize_Setting::json()` for parity with the other Customizer classes. This includes exporting of the `type`.
* Modifies `WP_Customize_Manager::post_value()` to apply `validate` after `sanitize`, and if validation fails, to return the `$default`.
* Introduces `customize_save_validation_before` action which fires right before the validation checks are made prior to saving.
JS changes:
* Introduces `wp.customize.Notification` in JS which to represent `WP_Error` instances returned from the server when setting validation fails.
* Introduces `wp.customize.Setting.prototype.notifications`.
* Introduces `wp.customize.Control.prototype.notifications`, which are synced with a control's settings' notifications.
* Introduces `wp.customize.Control.prototype.renderNotifications()` to re-render a control's notifications in its notification area. This is called automatically when the notifications collection changes.
* Introduces `wp.customize.settingConstructor`, allowing custom setting types to be used in the same way that custom controls, panels, and sections can be made.
* Injects a notification area into existing controls which is populated in response to the control's `notifications` collection changing. A custom control can customize the placement of the notification area by overriding the new `getNotificationsContainerElement` method.
* When a save fails due to setting invalidity, the invalidity errors will be added to the settings to then populate in the controls' notification areas, and the first such invalid control will be focused.
Props westonruter, celloexpressions, mrahmadawais.
See #35210.
See #30937.
Fixes #34893.
Built from https://develop.svn.wordpress.org/trunk@37476
git-svn-id: http://core.svn.wordpress.org/trunk@37444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-20 17:10:27 -04:00
|
|
|
/*
|
|
|
|
* Note that this debounced/deferred rendering is needed for two reasons:
|
|
|
|
* 1) The 'remove' event is triggered just _before_ the notification is actually removed.
|
|
|
|
* 2) Improve performance when adding/removing multiple notifications at a time.
|
|
|
|
*/
|
|
|
|
var debouncedRenderNotifications = _.debounce( function renderNotifications() {
|
|
|
|
control.renderNotifications();
|
|
|
|
} );
|
|
|
|
control.notifications.bind( 'add', function( notification ) {
|
|
|
|
wp.a11y.speak( notification.message, 'assertive' );
|
|
|
|
debouncedRenderNotifications();
|
|
|
|
} );
|
|
|
|
control.notifications.bind( 'remove', debouncedRenderNotifications );
|
|
|
|
control.renderNotifications();
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
control.ready();
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2014-11-11 18:52:22 -05:00
|
|
|
* Embed the control into the page.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
embed: function () {
|
|
|
|
var control = this,
|
|
|
|
inject;
|
|
|
|
|
|
|
|
// Watch for changes to the section state
|
|
|
|
inject = function ( sectionId ) {
|
|
|
|
var parentContainer;
|
2016-02-25 07:53:27 -05:00
|
|
|
if ( ! sectionId ) { // @todo allow a control to be embedded without a section, for instance a control embedded in the front end.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
// Wait for the section to be registered
|
|
|
|
api.section( sectionId, function ( section ) {
|
|
|
|
// Wait for the section to be ready/initialized
|
2014-12-02 17:56:45 -05:00
|
|
|
section.deferred.embedded.done( function () {
|
2016-09-23 18:23:30 -04:00
|
|
|
parentContainer = ( section.contentContainer.is( 'ul' ) ) ? section.contentContainer : section.contentContainer.find( 'ul:first' );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
if ( ! control.container.parent().is( parentContainer ) ) {
|
|
|
|
parentContainer.append( control.container );
|
|
|
|
control.renderContent();
|
|
|
|
}
|
2014-12-02 17:56:45 -05:00
|
|
|
control.deferred.embedded.resolve();
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
control.section.bind( inject );
|
|
|
|
inject( control.section.get() );
|
2012-08-22 20:04:18 -04:00
|
|
|
},
|
|
|
|
|
2014-08-08 19:31:15 -04:00
|
|
|
/**
|
2014-11-11 18:52:22 -05:00
|
|
|
* Triggered when the control's markup has been injected into the DOM.
|
|
|
|
*
|
2016-10-25 02:31:31 -04:00
|
|
|
* @returns {void}
|
2014-08-08 19:31:15 -04:00
|
|
|
*/
|
2016-10-25 02:31:31 -04:00
|
|
|
ready: function() {
|
|
|
|
var control = this, newItem;
|
|
|
|
if ( 'dropdown-pages' === control.params.type && control.params.allow_addition ) {
|
|
|
|
newItem = control.container.find( '.new-content-item' );
|
|
|
|
newItem.hide(); // Hide in JS to preserve flex display when showing.
|
|
|
|
control.container.on( 'click', '.add-new-toggle', function( e ) {
|
|
|
|
$( e.currentTarget ).slideUp( 180 );
|
|
|
|
newItem.slideDown( 180 );
|
|
|
|
newItem.find( '.create-item-input' ).focus();
|
|
|
|
});
|
|
|
|
control.container.on( 'click', '.add-content', function() {
|
|
|
|
control.addNewPage();
|
|
|
|
});
|
|
|
|
control.container.on( 'keyup', '.create-item-input', function( e ) {
|
|
|
|
if ( 13 === e.which ) { // Enter
|
|
|
|
control.addNewPage();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
},
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Add setting validation model and control notifications to augment setting sanitization.
When a setting is invalid, not only will it be blocked from being saved but all other settings will be blocked as well. This ensures that Customizer saves aren't partial but are more transactional. User will be displayed the error in a notification so that they can fix and re-attempt saving.
PHP changes:
* Introduces `WP_Customize_Setting::validate()`, `WP_Customize_Setting::$validate_callback`, and the `customize_validate_{$setting_id}` filter.
* Introduces `WP_Customize_Manager::validate_setting_values()` to do validation (and sanitization) for the setting values supplied, returning a list of `WP_Error` instances for invalid settings.
* Attempting to save settings that are invalid will result in the save being blocked entirely, with the errors being sent in the `customize_save_response`. Modifies `WP_Customize_Manager::save()` to check all settings for validity issues prior to calling their `save` methods.
* Introduces `WP_Customize_Setting::json()` for parity with the other Customizer classes. This includes exporting of the `type`.
* Modifies `WP_Customize_Manager::post_value()` to apply `validate` after `sanitize`, and if validation fails, to return the `$default`.
* Introduces `customize_save_validation_before` action which fires right before the validation checks are made prior to saving.
JS changes:
* Introduces `wp.customize.Notification` in JS which to represent `WP_Error` instances returned from the server when setting validation fails.
* Introduces `wp.customize.Setting.prototype.notifications`.
* Introduces `wp.customize.Control.prototype.notifications`, which are synced with a control's settings' notifications.
* Introduces `wp.customize.Control.prototype.renderNotifications()` to re-render a control's notifications in its notification area. This is called automatically when the notifications collection changes.
* Introduces `wp.customize.settingConstructor`, allowing custom setting types to be used in the same way that custom controls, panels, and sections can be made.
* Injects a notification area into existing controls which is populated in response to the control's `notifications` collection changing. A custom control can customize the placement of the notification area by overriding the new `getNotificationsContainerElement` method.
* When a save fails due to setting invalidity, the invalidity errors will be added to the settings to then populate in the controls' notification areas, and the first such invalid control will be focused.
Props westonruter, celloexpressions, mrahmadawais.
See #35210.
See #30937.
Fixes #34893.
Built from https://develop.svn.wordpress.org/trunk@37476
git-svn-id: http://core.svn.wordpress.org/trunk@37444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-20 17:10:27 -04:00
|
|
|
/**
|
|
|
|
* Get the element inside of a control's container that contains the validation error message.
|
|
|
|
*
|
|
|
|
* Control subclasses may override this to return the proper container to render notifications into.
|
|
|
|
* Injects the notification container for existing controls that lack the necessary container,
|
|
|
|
* including special handling for nav menu items and widgets.
|
|
|
|
*
|
|
|
|
* @since 4.6.0
|
|
|
|
* @returns {jQuery} Setting validation message element.
|
|
|
|
* @this {wp.customize.Control}
|
|
|
|
*/
|
|
|
|
getNotificationsContainerElement: function() {
|
|
|
|
var control = this, controlTitle, notificationsContainer;
|
|
|
|
|
|
|
|
notificationsContainer = control.container.find( '.customize-control-notifications-container:first' );
|
|
|
|
if ( notificationsContainer.length ) {
|
|
|
|
return notificationsContainer;
|
|
|
|
}
|
|
|
|
|
|
|
|
notificationsContainer = $( '<div class="customize-control-notifications-container"></div>' );
|
|
|
|
|
|
|
|
if ( control.container.hasClass( 'customize-control-nav_menu_item' ) ) {
|
|
|
|
control.container.find( '.menu-item-settings:first' ).prepend( notificationsContainer );
|
|
|
|
} else if ( control.container.hasClass( 'customize-control-widget_form' ) ) {
|
|
|
|
control.container.find( '.widget-inside:first' ).prepend( notificationsContainer );
|
|
|
|
} else {
|
|
|
|
controlTitle = control.container.find( '.customize-control-title' );
|
|
|
|
if ( controlTitle.length ) {
|
|
|
|
controlTitle.after( notificationsContainer );
|
|
|
|
} else {
|
|
|
|
control.container.prepend( notificationsContainer );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return notificationsContainer;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Render notifications.
|
|
|
|
*
|
|
|
|
* Renders the `control.notifications` into the control's container.
|
|
|
|
* Control subclasses may override this method to do their own handling
|
|
|
|
* of rendering notifications.
|
|
|
|
*
|
|
|
|
* @since 4.6.0
|
|
|
|
* @this {wp.customize.Control}
|
|
|
|
*/
|
|
|
|
renderNotifications: function() {
|
|
|
|
var control = this, container, notifications, hasError = false;
|
|
|
|
container = control.getNotificationsContainerElement();
|
|
|
|
if ( ! container || ! container.length ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
notifications = [];
|
|
|
|
control.notifications.each( function( notification ) {
|
|
|
|
notifications.push( notification );
|
|
|
|
if ( 'error' === notification.type ) {
|
|
|
|
hasError = true;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
if ( 0 === notifications.length ) {
|
|
|
|
container.stop().slideUp( 'fast' );
|
|
|
|
} else {
|
|
|
|
container.stop().slideDown( 'fast', null, function() {
|
|
|
|
$( this ).css( 'height', 'auto' );
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ! control.notificationsTemplate ) {
|
|
|
|
control.notificationsTemplate = wp.template( 'customize-control-notifications' );
|
|
|
|
}
|
|
|
|
|
|
|
|
control.container.toggleClass( 'has-notifications', 0 !== notifications.length );
|
|
|
|
control.container.toggleClass( 'has-error', hasError );
|
|
|
|
container.empty().append( $.trim(
|
|
|
|
control.notificationsTemplate( { notifications: notifications, altNotice: Boolean( control.altNotice ) } )
|
|
|
|
) );
|
|
|
|
},
|
|
|
|
|
2014-07-09 19:58:16 -04:00
|
|
|
/**
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* Normal controls do not expand, so just expand its parent
|
2014-07-09 19:58:16 -04:00
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @param {Object} [params]
|
|
|
|
*/
|
|
|
|
expand: function ( params ) {
|
|
|
|
api.section( this.section() ).expand( params );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* Bring the containing section and panel into view and then
|
|
|
|
* this control into view, focusing on the first input.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
focus: focus,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update UI in response to a change in the control's active state.
|
|
|
|
* This does not change the active state, it merely handles the behavior
|
|
|
|
* for when it does change.
|
2014-07-09 19:58:16 -04:00
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
|
|
|
* @param {Boolean} active
|
|
|
|
* @param {Object} args
|
|
|
|
* @param {Number} args.duration
|
2016-11-04 13:18:26 -04:00
|
|
|
* @param {Callback} args.completeCallback
|
2014-07-09 19:58:16 -04:00
|
|
|
*/
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
onChangeActive: function ( active, args ) {
|
2015-08-26 03:26:21 -04:00
|
|
|
if ( args.unchanged ) {
|
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-09-25 15:54:50 -04:00
|
|
|
if ( ! $.contains( document, this.container[0] ) ) {
|
2014-11-11 17:37:22 -05:00
|
|
|
// jQuery.fn.slideUp is not hiding an element if it is not in the DOM
|
|
|
|
this.container.toggle( active );
|
2014-12-15 14:54:21 -05:00
|
|
|
if ( args.completeCallback ) {
|
|
|
|
args.completeCallback();
|
|
|
|
}
|
2014-11-11 17:37:22 -05:00
|
|
|
} else if ( active ) {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
this.container.slideDown( args.duration, args.completeCallback );
|
2014-07-09 19:58:16 -04:00
|
|
|
} else {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
this.container.slideUp( args.duration, args.completeCallback );
|
2014-07-09 19:58:16 -04:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* @deprecated 4.1.0 Use this.onChangeActive() instead.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
*/
|
|
|
|
toggle: function ( active ) {
|
|
|
|
return this.onChangeActive( active, this.defaultActiveArguments );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Shorthand way to enable the active state.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @param {Object} [params]
|
|
|
|
* @returns {Boolean} false if already active
|
|
|
|
*/
|
|
|
|
activate: Container.prototype.activate,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Shorthand way to disable the active state.
|
|
|
|
*
|
2014-12-03 21:04:22 -05:00
|
|
|
* @since 4.1.0
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* @param {Object} [params]
|
|
|
|
* @returns {Boolean} false if already inactive
|
|
|
|
*/
|
|
|
|
deactivate: Container.prototype.deactivate,
|
|
|
|
|
2014-12-15 14:54:21 -05:00
|
|
|
/**
|
|
|
|
* Re-use _toggleActive from Container class.
|
|
|
|
*
|
|
|
|
* @access private
|
|
|
|
*/
|
|
|
|
_toggleActive: Container.prototype._toggleActive,
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
dropdownInit: function() {
|
2013-11-15 01:08:10 -05:00
|
|
|
var control = this,
|
|
|
|
statuses = this.container.find('.dropdown-status'),
|
|
|
|
params = this.params,
|
|
|
|
toggleFreeze = false,
|
|
|
|
update = function( to ) {
|
|
|
|
if ( typeof to === 'string' && params.statuses && params.statuses[ to ] )
|
2012-08-22 20:04:18 -04:00
|
|
|
statuses.html( params.statuses[ to ] ).show();
|
|
|
|
else
|
|
|
|
statuses.hide();
|
|
|
|
};
|
2012-11-09 00:44:00 -05:00
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Support the .dropdown class to open/close complex elements
|
2012-11-20 16:25:54 -05:00
|
|
|
this.container.on( 'click keydown', '.dropdown', function( event ) {
|
2014-12-02 17:56:45 -05:00
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
2012-11-20 16:25:54 -05:00
|
|
|
return;
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
2012-11-20 16:25:54 -05:00
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
event.preventDefault();
|
2012-11-09 00:44:00 -05:00
|
|
|
|
2012-11-06 09:47:25 -05:00
|
|
|
if (!toggleFreeze)
|
|
|
|
control.container.toggleClass('open');
|
2012-11-09 00:44:00 -05:00
|
|
|
|
2012-11-09 15:57:09 -05:00
|
|
|
if ( control.container.hasClass('open') )
|
|
|
|
control.container.parent().parent().find('li.library-selected').focus();
|
|
|
|
|
2012-11-06 09:47:25 -05:00
|
|
|
// Don't want to fire focus and click at same time
|
|
|
|
toggleFreeze = true;
|
|
|
|
setTimeout(function () {
|
|
|
|
toggleFreeze = false;
|
|
|
|
}, 400);
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
this.setting.bind( update );
|
|
|
|
update( this.setting() );
|
2014-10-24 12:32:18 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Render the control from its JS template, if it exists.
|
|
|
|
*
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
* The control's container must already exist in the DOM.
|
2014-12-03 21:04:22 -05:00
|
|
|
*
|
|
|
|
* @since 4.1.0
|
2014-10-24 12:32:18 -04:00
|
|
|
*/
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
renderContent: function () {
|
2014-10-24 12:32:18 -04:00
|
|
|
var template,
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
control = this;
|
2014-10-26 08:06:19 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
// Replace the container element's content with the control.
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
if ( 0 !== $( '#tmpl-' + control.templateSelector ).length ) {
|
|
|
|
template = wp.template( control.templateSelector );
|
|
|
|
if ( template && control.container ) {
|
2014-11-11 18:52:22 -05:00
|
|
|
control.container.html( template( control.params ) );
|
2014-10-24 12:32:18 -04:00
|
|
|
}
|
|
|
|
}
|
2016-10-25 02:31:31 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add a new page to a dropdown-pages control reusing menus code for this.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
|
|
|
* @access private
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
addNewPage: function () {
|
|
|
|
var control = this, promise, toggle, container, input, title, select;
|
|
|
|
|
|
|
|
if ( 'dropdown-pages' !== control.params.type || ! control.params.allow_addition || ! api.Menus ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
toggle = control.container.find( '.add-new-toggle' );
|
|
|
|
container = control.container.find( '.new-content-item' );
|
|
|
|
input = control.container.find( '.create-item-input' );
|
|
|
|
title = input.val();
|
|
|
|
select = control.container.find( 'select' );
|
|
|
|
|
|
|
|
if ( ! title ) {
|
|
|
|
input.addClass( 'invalid' );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
input.removeClass( 'invalid' );
|
|
|
|
input.attr( 'disabled', 'disabled' );
|
|
|
|
|
|
|
|
// The menus functions add the page, publish when appropriate, and also add the new page to the dropdown-pages controls.
|
|
|
|
promise = api.Menus.insertAutoDraftPost( {
|
|
|
|
post_title: title,
|
|
|
|
post_type: 'page'
|
|
|
|
} );
|
|
|
|
promise.done( function( data ) {
|
|
|
|
var availableItem, $content, itemTemplate;
|
|
|
|
|
|
|
|
// Prepare the new page as an available menu item.
|
|
|
|
// See api.Menus.submitNew().
|
|
|
|
availableItem = new api.Menus.AvailableItemModel( {
|
|
|
|
'id': 'post-' + data.post_id, // Used for available menu item Backbone models.
|
|
|
|
'title': title,
|
2017-04-05 19:29:42 -04:00
|
|
|
'type': 'post_type',
|
2016-10-25 02:31:31 -04:00
|
|
|
'type_label': api.Menus.data.l10n.page_label,
|
2017-04-05 19:29:42 -04:00
|
|
|
'object': 'page',
|
2016-10-25 02:31:31 -04:00
|
|
|
'object_id': data.post_id,
|
|
|
|
'url': data.url
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Add the new item to the list of available menu items.
|
|
|
|
api.Menus.availableMenuItemsPanel.collection.add( availableItem );
|
|
|
|
$content = $( '#available-menu-items-post_type-page' ).find( '.available-menu-items-list' );
|
|
|
|
itemTemplate = wp.template( 'available-menu-item' );
|
|
|
|
$content.prepend( itemTemplate( availableItem.attributes ) );
|
|
|
|
|
|
|
|
// Focus the select control.
|
|
|
|
select.focus();
|
|
|
|
control.setting.set( String( data.post_id ) ); // Triggers a preview refresh and updates the setting.
|
|
|
|
|
|
|
|
// Reset the create page form.
|
|
|
|
container.slideUp( 180 );
|
|
|
|
toggle.slideDown( 180 );
|
2016-11-23 01:05:32 -05:00
|
|
|
} );
|
|
|
|
promise.always( function() {
|
2016-10-25 02:31:31 -04:00
|
|
|
input.val( '' ).removeAttr( 'disabled' );
|
|
|
|
} );
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2014-08-08 19:31:15 -04:00
|
|
|
/**
|
2014-11-11 18:52:22 -05:00
|
|
|
* A colorpicker control.
|
|
|
|
*
|
|
|
|
* @class
|
2014-08-08 19:31:15 -04:00
|
|
|
* @augments wp.customize.Control
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
api.ColorControl = api.Control.extend({
|
|
|
|
ready: function() {
|
|
|
|
var control = this,
|
2016-10-25 18:33:30 -04:00
|
|
|
isHueSlider = this.params.mode === 'hue',
|
|
|
|
updating = false,
|
|
|
|
picker;
|
|
|
|
|
|
|
|
if ( isHueSlider ) {
|
|
|
|
picker = this.container.find( '.color-picker-hue' );
|
|
|
|
picker.val( control.setting() ).wpColorPicker({
|
|
|
|
change: function( event, ui ) {
|
|
|
|
updating = true;
|
|
|
|
control.setting( ui.color.h() );
|
|
|
|
updating = false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
picker = this.container.find( '.color-picker-hex' );
|
|
|
|
picker.val( control.setting() ).wpColorPicker({
|
|
|
|
change: function() {
|
|
|
|
updating = true;
|
|
|
|
control.setting.set( picker.wpColorPicker( 'color' ) );
|
|
|
|
updating = false;
|
|
|
|
},
|
|
|
|
clear: function() {
|
|
|
|
updating = true;
|
|
|
|
control.setting.set( '' );
|
|
|
|
updating = false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2014-10-31 16:45:22 -04:00
|
|
|
|
2016-11-04 13:08:33 -04:00
|
|
|
control.setting.bind( function ( value ) {
|
2016-11-23 01:05:32 -05:00
|
|
|
// Bail if the update came from the control itself.
|
2016-10-25 18:33:30 -04:00
|
|
|
if ( updating ) {
|
|
|
|
return;
|
|
|
|
}
|
2014-10-31 16:45:22 -04:00
|
|
|
picker.val( value );
|
|
|
|
picker.wpColorPicker( 'color', value );
|
2016-10-25 18:33:30 -04:00
|
|
|
} );
|
2016-11-04 13:08:33 -04:00
|
|
|
|
|
|
|
// Collapse color picker when hitting Esc instead of collapsing the current section.
|
|
|
|
control.container.on( 'keydown', function( event ) {
|
|
|
|
var pickerContainer;
|
|
|
|
if ( 27 !== event.which ) { // Esc.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
pickerContainer = control.container.find( '.wp-picker-container' );
|
|
|
|
if ( pickerContainer.hasClass( 'wp-picker-active' ) ) {
|
|
|
|
picker.wpColorPicker( 'close' );
|
|
|
|
control.container.find( '.wp-color-result' ).focus();
|
|
|
|
event.stopPropagation(); // Prevent section from being collapsed.
|
|
|
|
}
|
|
|
|
} );
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2014-08-08 19:31:15 -04:00
|
|
|
/**
|
2015-03-10 14:02:28 -04:00
|
|
|
* A control that implements the media modal.
|
2014-11-11 18:52:22 -05:00
|
|
|
*
|
|
|
|
* @class
|
2014-08-08 19:31:15 -04:00
|
|
|
* @augments wp.customize.Control
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
2015-03-10 14:02:28 -04:00
|
|
|
api.MediaControl = api.Control.extend({
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
/**
|
|
|
|
* When the control's DOM structure is ready,
|
|
|
|
* set up internal event bindings.
|
|
|
|
*/
|
2014-12-02 17:56:45 -05:00
|
|
|
ready: function() {
|
2014-11-11 18:52:22 -05:00
|
|
|
var control = this;
|
|
|
|
// Shortcut so that we don't have to use _.bind every time we add a callback.
|
2015-03-07 06:06:29 -05:00
|
|
|
_.bindAll( control, 'restoreDefault', 'removeFile', 'openFrame', 'select', 'pausePlayer' );
|
2012-11-20 16:25:54 -05:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
// Bind events, with delegation to facilitate re-rendering.
|
|
|
|
control.container.on( 'click keydown', '.upload-button', control.openFrame );
|
2015-03-07 06:06:29 -05:00
|
|
|
control.container.on( 'click keydown', '.upload-button', control.pausePlayer );
|
2014-11-11 18:52:22 -05:00
|
|
|
control.container.on( 'click keydown', '.thumbnail-image img', control.openFrame );
|
|
|
|
control.container.on( 'click keydown', '.default-button', control.restoreDefault );
|
2015-03-07 06:06:29 -05:00
|
|
|
control.container.on( 'click keydown', '.remove-button', control.pausePlayer );
|
2014-11-11 18:52:22 -05:00
|
|
|
control.container.on( 'click keydown', '.remove-button', control.removeFile );
|
2015-03-07 06:06:29 -05:00
|
|
|
control.container.on( 'click keydown', '.remove-button', control.cleanupPlayer );
|
|
|
|
|
|
|
|
// Resize the player controls when it becomes visible (ie when section is expanded)
|
|
|
|
api.section( control.section() ).container
|
|
|
|
.on( 'expanded', function() {
|
|
|
|
if ( control.player ) {
|
|
|
|
control.player.setControlsSize();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.on( 'collapsed', function() {
|
|
|
|
control.pausePlayer();
|
|
|
|
});
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2016-06-14 15:28:27 -04:00
|
|
|
/**
|
|
|
|
* Set attachment data and render content.
|
|
|
|
*
|
|
|
|
* Note that BackgroundImage.prototype.ready applies this ready method
|
|
|
|
* to itself. Since BackgroundImage is an UploadControl, the value
|
|
|
|
* is the attachment URL instead of the attachment ID. In this case
|
|
|
|
* we skip fetching the attachment data because we have no ID available,
|
|
|
|
* and it is the responsibility of the UploadControl to set the control's
|
|
|
|
* attachmentData before calling the renderContent method.
|
|
|
|
*
|
|
|
|
* @param {number|string} value Attachment
|
|
|
|
*/
|
|
|
|
function setAttachmentDataAndRenderContent( value ) {
|
|
|
|
var hasAttachmentData = $.Deferred();
|
|
|
|
|
|
|
|
if ( control.extended( api.UploadControl ) ) {
|
|
|
|
hasAttachmentData.resolve();
|
|
|
|
} else {
|
|
|
|
value = parseInt( value, 10 );
|
|
|
|
if ( _.isNaN( value ) || value <= 0 ) {
|
|
|
|
delete control.params.attachment;
|
|
|
|
hasAttachmentData.resolve();
|
|
|
|
} else if ( control.params.attachment && control.params.attachment.id === value ) {
|
|
|
|
hasAttachmentData.resolve();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Fetch the attachment data.
|
|
|
|
if ( 'pending' === hasAttachmentData.state() ) {
|
|
|
|
wp.media.attachment( value ).fetch().done( function() {
|
|
|
|
control.params.attachment = this.attributes;
|
|
|
|
hasAttachmentData.resolve();
|
2016-03-04 18:47:26 -05:00
|
|
|
|
2016-06-14 15:28:27 -04:00
|
|
|
// Send attachment information to the preview for possible use in `postMessage` transport.
|
|
|
|
wp.customize.previewer.send( control.setting.id + '-attachment-data', this.attributes );
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
|
|
|
hasAttachmentData.done( function() {
|
|
|
|
control.renderContent();
|
2016-03-04 18:47:26 -05:00
|
|
|
} );
|
2016-06-14 15:28:27 -04:00
|
|
|
}
|
2016-03-04 18:47:26 -05:00
|
|
|
|
2016-06-14 15:28:27 -04:00
|
|
|
// Ensure attachment data is initially set (for dynamically-instantiated controls).
|
|
|
|
setAttachmentDataAndRenderContent( control.setting() );
|
|
|
|
|
|
|
|
// Update the attachment data and re-render the control when the setting changes.
|
|
|
|
control.setting.bind( setAttachmentDataAndRenderContent );
|
2012-08-22 20:04:18 -04:00
|
|
|
},
|
|
|
|
|
2015-03-07 06:06:29 -05:00
|
|
|
pausePlayer: function () {
|
|
|
|
this.player && this.player.pause();
|
|
|
|
},
|
|
|
|
|
|
|
|
cleanupPlayer: function () {
|
|
|
|
this.player && wp.media.mixin.removePlayer( this.player );
|
|
|
|
},
|
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
/**
|
|
|
|
* Open the media modal.
|
|
|
|
*/
|
|
|
|
openFrame: function( event ) {
|
2014-12-02 17:56:45 -05:00
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
2014-11-11 18:52:22 -05:00
|
|
|
return;
|
2014-12-02 17:56:45 -05:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
event.preventDefault();
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
if ( ! this.frame ) {
|
|
|
|
this.initFrame();
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
this.frame.open();
|
|
|
|
},
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
/**
|
|
|
|
* Create a media modal select frame, and store it so the instance can be reused when needed.
|
|
|
|
*/
|
|
|
|
initFrame: function() {
|
|
|
|
this.frame = wp.media({
|
|
|
|
button: {
|
|
|
|
text: this.params.button_labels.frame_button
|
|
|
|
},
|
2014-12-15 15:27:22 -05:00
|
|
|
states: [
|
|
|
|
new wp.media.controller.Library({
|
|
|
|
title: this.params.button_labels.frame_title,
|
|
|
|
library: wp.media.query({ type: this.params.mime_type }),
|
|
|
|
multiple: false,
|
|
|
|
date: false
|
|
|
|
})
|
|
|
|
]
|
2014-12-02 17:56:45 -05:00
|
|
|
});
|
2012-11-09 00:44:00 -05:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
// When a file is selected, run a callback.
|
|
|
|
this.frame.on( 'select', this.select );
|
2014-12-02 17:56:45 -05:00
|
|
|
},
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
/**
|
|
|
|
* Callback handler for when an attachment is selected in the media modal.
|
|
|
|
* Gets the selected image information, and sets it within the control.
|
|
|
|
*/
|
|
|
|
select: function() {
|
|
|
|
// Get the attachment from the modal frame.
|
2015-03-07 06:06:29 -05:00
|
|
|
var node,
|
|
|
|
attachment = this.frame.state().get( 'selection' ).first().toJSON(),
|
|
|
|
mejsSettings = window._wpmejsSettings || {};
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
this.params.attachment = attachment;
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
// Set the Customizer setting; the callback takes care of rendering.
|
2015-03-10 14:02:28 -04:00
|
|
|
this.setting( attachment.id );
|
2015-03-07 06:06:29 -05:00
|
|
|
node = this.container.find( 'audio, video' ).get(0);
|
|
|
|
|
|
|
|
// Initialize audio/video previews.
|
|
|
|
if ( node ) {
|
|
|
|
this.player = new MediaElementPlayer( node, mejsSettings );
|
|
|
|
} else {
|
|
|
|
this.cleanupPlayer();
|
|
|
|
}
|
2014-11-11 18:52:22 -05:00
|
|
|
},
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
/**
|
|
|
|
* Reset the setting to the default value.
|
|
|
|
*/
|
|
|
|
restoreDefault: function( event ) {
|
2014-12-02 17:56:45 -05:00
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
2014-11-11 18:52:22 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
event.preventDefault();
|
2012-11-06 09:47:25 -05:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
this.params.attachment = this.params.defaultAttachment;
|
|
|
|
this.setting( this.params.defaultAttachment.url );
|
2015-04-08 16:52:29 -04:00
|
|
|
},
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
/**
|
|
|
|
* Called when the "Remove" link is clicked. Empties the setting.
|
|
|
|
*
|
|
|
|
* @param {object} event jQuery Event object
|
|
|
|
*/
|
|
|
|
removeFile: function( event ) {
|
2014-12-02 17:56:45 -05:00
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
2014-11-11 18:52:22 -05:00
|
|
|
return;
|
2014-12-02 17:56:45 -05:00
|
|
|
}
|
2014-11-11 18:52:22 -05:00
|
|
|
event.preventDefault();
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
this.params.attachment = {};
|
|
|
|
this.setting( '' );
|
|
|
|
this.renderContent(); // Not bound to setting change when emptying.
|
2015-03-10 14:02:28 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* An upload control, which utilizes the media modal.
|
|
|
|
*
|
|
|
|
* @class
|
|
|
|
* @augments wp.customize.MediaControl
|
|
|
|
* @augments wp.customize.Control
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
|
|
|
api.UploadControl = api.MediaControl.extend({
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Callback handler for when an attachment is selected in the media modal.
|
|
|
|
* Gets the selected image information, and sets it within the control.
|
|
|
|
*/
|
|
|
|
select: function() {
|
|
|
|
// Get the attachment from the modal frame.
|
|
|
|
var node,
|
|
|
|
attachment = this.frame.state().get( 'selection' ).first().toJSON(),
|
|
|
|
mejsSettings = window._wpmejsSettings || {};
|
|
|
|
|
|
|
|
this.params.attachment = attachment;
|
|
|
|
|
|
|
|
// Set the Customizer setting; the callback takes care of rendering.
|
|
|
|
this.setting( attachment.url );
|
|
|
|
node = this.container.find( 'audio, video' ).get(0);
|
|
|
|
|
|
|
|
// Initialize audio/video previews.
|
|
|
|
if ( node ) {
|
|
|
|
this.player = new MediaElementPlayer( node, mejsSettings );
|
|
|
|
} else {
|
|
|
|
this.cleanupPlayer();
|
|
|
|
}
|
2014-12-02 17:56:45 -05:00
|
|
|
},
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
// @deprecated
|
|
|
|
success: function() {},
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
// @deprecated
|
|
|
|
removerVisibility: function() {}
|
2014-12-02 17:56:45 -05:00
|
|
|
});
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
/**
|
|
|
|
* A control for uploading images.
|
|
|
|
*
|
|
|
|
* This control no longer needs to do anything more
|
|
|
|
* than what the upload control does in JS.
|
|
|
|
*
|
|
|
|
* @class
|
|
|
|
* @augments wp.customize.UploadControl
|
2015-03-10 14:02:28 -04:00
|
|
|
* @augments wp.customize.MediaControl
|
2014-11-11 18:52:22 -05:00
|
|
|
* @augments wp.customize.Control
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
|
|
|
api.ImageControl = api.UploadControl.extend({
|
|
|
|
// @deprecated
|
|
|
|
thumbnailSrc: function() {}
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
2014-12-15 18:28:23 -05:00
|
|
|
/**
|
|
|
|
* A control for uploading background images.
|
|
|
|
*
|
|
|
|
* @class
|
|
|
|
* @augments wp.customize.UploadControl
|
2015-03-10 14:02:28 -04:00
|
|
|
* @augments wp.customize.MediaControl
|
2014-12-15 18:28:23 -05:00
|
|
|
* @augments wp.customize.Control
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
|
|
|
api.BackgroundControl = api.UploadControl.extend({
|
|
|
|
|
|
|
|
/**
|
|
|
|
* When the control's DOM structure is ready,
|
|
|
|
* set up internal event bindings.
|
|
|
|
*/
|
|
|
|
ready: function() {
|
|
|
|
api.UploadControl.prototype.ready.apply( this, arguments );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Callback handler for when an attachment is selected in the media modal.
|
|
|
|
* Does an additional AJAX request for setting the background context.
|
|
|
|
*/
|
|
|
|
select: function() {
|
|
|
|
api.UploadControl.prototype.select.apply( this, arguments );
|
|
|
|
|
|
|
|
wp.ajax.post( 'custom-background-add', {
|
|
|
|
nonce: _wpCustomizeBackground.nonces.add,
|
|
|
|
wp_customize: 'on',
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
customize_theme: api.settings.theme.stylesheet,
|
2014-12-15 18:28:23 -05:00
|
|
|
attachment_id: this.params.attachment.id
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
Customize: Improve custom background properties UI.
Introduces new control for managing the background position. Adds control for setting the `background-size`.
Props cdog, celloexpressions, grapplerulrich, MikeHansenMe, FolioVision, afercia, helen, melchoyce, karmatosed, westonruter, Kelderic, sebastian.pisula.
Fixes #22058.
Built from https://develop.svn.wordpress.org/trunk@38948
git-svn-id: http://core.svn.wordpress.org/trunk@38891 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-26 02:52:29 -04:00
|
|
|
/**
|
|
|
|
* A control for positioning a background image.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
|
|
|
*
|
|
|
|
* @class
|
|
|
|
* @augments wp.customize.Control
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
|
|
|
api.BackgroundPositionControl = api.Control.extend( {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set up control UI once embedded in DOM and settings are created.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
2016-11-23 01:05:32 -05:00
|
|
|
* @access public
|
Customize: Improve custom background properties UI.
Introduces new control for managing the background position. Adds control for setting the `background-size`.
Props cdog, celloexpressions, grapplerulrich, MikeHansenMe, FolioVision, afercia, helen, melchoyce, karmatosed, westonruter, Kelderic, sebastian.pisula.
Fixes #22058.
Built from https://develop.svn.wordpress.org/trunk@38948
git-svn-id: http://core.svn.wordpress.org/trunk@38891 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-26 02:52:29 -04:00
|
|
|
*/
|
|
|
|
ready: function() {
|
|
|
|
var control = this, updateRadios;
|
|
|
|
|
|
|
|
control.container.on( 'change', 'input[name="background-position"]', function() {
|
|
|
|
var position = $( this ).val().split( ' ' );
|
|
|
|
control.settings.x( position[0] );
|
|
|
|
control.settings.y( position[1] );
|
|
|
|
} );
|
|
|
|
|
|
|
|
updateRadios = _.debounce( function() {
|
|
|
|
var x, y, radioInput, inputValue;
|
|
|
|
x = control.settings.x.get();
|
|
|
|
y = control.settings.y.get();
|
|
|
|
inputValue = String( x ) + ' ' + String( y );
|
|
|
|
radioInput = control.container.find( 'input[name="background-position"][value="' + inputValue + '"]' );
|
|
|
|
radioInput.click();
|
|
|
|
} );
|
|
|
|
control.settings.x.bind( updateRadios );
|
|
|
|
control.settings.y.bind( updateRadios );
|
|
|
|
|
|
|
|
updateRadios(); // Set initial UI.
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
2015-07-10 17:33:24 -04:00
|
|
|
/**
|
|
|
|
* A control for selecting and cropping an image.
|
|
|
|
*
|
|
|
|
* @class
|
|
|
|
* @augments wp.customize.MediaControl
|
|
|
|
* @augments wp.customize.Control
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
|
|
|
api.CroppedImageControl = api.MediaControl.extend({
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Open the media modal to the library state.
|
|
|
|
*/
|
|
|
|
openFrame: function( event ) {
|
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.initFrame();
|
|
|
|
this.frame.setState( 'library' ).open();
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a media modal select frame, and store it so the instance can be reused when needed.
|
|
|
|
*/
|
|
|
|
initFrame: function() {
|
|
|
|
var l10n = _wpMediaViewsL10n;
|
|
|
|
|
|
|
|
this.frame = wp.media({
|
|
|
|
button: {
|
|
|
|
text: l10n.select,
|
|
|
|
close: false
|
|
|
|
},
|
|
|
|
states: [
|
|
|
|
new wp.media.controller.Library({
|
|
|
|
title: this.params.button_labels.frame_title,
|
|
|
|
library: wp.media.query({ type: 'image' }),
|
|
|
|
multiple: false,
|
|
|
|
date: false,
|
|
|
|
priority: 20,
|
|
|
|
suggestedWidth: this.params.width,
|
|
|
|
suggestedHeight: this.params.height
|
|
|
|
}),
|
2015-07-27 11:55:24 -04:00
|
|
|
new wp.media.controller.CustomizeImageCropper({
|
2015-07-10 17:33:24 -04:00
|
|
|
imgSelectOptions: this.calculateImageSelectOptions,
|
|
|
|
control: this
|
|
|
|
})
|
|
|
|
]
|
|
|
|
});
|
|
|
|
|
|
|
|
this.frame.on( 'select', this.onSelect, this );
|
|
|
|
this.frame.on( 'cropped', this.onCropped, this );
|
|
|
|
this.frame.on( 'skippedcrop', this.onSkippedCrop, this );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* After an image is selected in the media modal, switch to the cropper
|
|
|
|
* state if the image isn't the right size.
|
|
|
|
*/
|
|
|
|
onSelect: function() {
|
|
|
|
var attachment = this.frame.state().get( 'selection' ).first().toJSON();
|
|
|
|
|
|
|
|
if ( this.params.width === attachment.width && this.params.height === attachment.height && ! this.params.flex_width && ! this.params.flex_height ) {
|
|
|
|
this.setImageFromAttachment( attachment );
|
|
|
|
this.frame.close();
|
|
|
|
} else {
|
|
|
|
this.frame.setState( 'cropper' );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* After the image has been cropped, apply the cropped image data to the setting.
|
|
|
|
*
|
|
|
|
* @param {object} croppedImage Cropped attachment data.
|
|
|
|
*/
|
|
|
|
onCropped: function( croppedImage ) {
|
|
|
|
this.setImageFromAttachment( croppedImage );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a set of options, computed from the attached image data and
|
|
|
|
* control-specific data, to be fed to the imgAreaSelect plugin in
|
|
|
|
* wp.media.view.Cropper.
|
|
|
|
*
|
|
|
|
* @param {wp.media.model.Attachment} attachment
|
|
|
|
* @param {wp.media.controller.Cropper} controller
|
|
|
|
* @returns {Object} Options
|
|
|
|
*/
|
|
|
|
calculateImageSelectOptions: function( attachment, controller ) {
|
|
|
|
var control = controller.get( 'control' ),
|
|
|
|
flexWidth = !! parseInt( control.params.flex_width, 10 ),
|
|
|
|
flexHeight = !! parseInt( control.params.flex_height, 10 ),
|
|
|
|
realWidth = attachment.get( 'width' ),
|
|
|
|
realHeight = attachment.get( 'height' ),
|
|
|
|
xInit = parseInt( control.params.width, 10 ),
|
|
|
|
yInit = parseInt( control.params.height, 10 ),
|
|
|
|
ratio = xInit / yInit,
|
2016-04-07 21:23:29 -04:00
|
|
|
xImg = xInit,
|
|
|
|
yImg = yInit,
|
2015-07-20 15:02:24 -04:00
|
|
|
x1, y1, imgSelectOptions;
|
2015-07-10 17:33:24 -04:00
|
|
|
|
|
|
|
controller.set( 'canSkipCrop', ! control.mustBeCropped( flexWidth, flexHeight, xInit, yInit, realWidth, realHeight ) );
|
|
|
|
|
2016-04-07 21:23:29 -04:00
|
|
|
if ( realWidth / realHeight > ratio ) {
|
|
|
|
yInit = realHeight;
|
2015-07-10 17:33:24 -04:00
|
|
|
xInit = yInit * ratio;
|
|
|
|
} else {
|
2016-04-07 21:23:29 -04:00
|
|
|
xInit = realWidth;
|
2015-07-10 17:33:24 -04:00
|
|
|
yInit = xInit / ratio;
|
|
|
|
}
|
|
|
|
|
2016-04-07 21:23:29 -04:00
|
|
|
x1 = ( realWidth - xInit ) / 2;
|
|
|
|
y1 = ( realHeight - yInit ) / 2;
|
2015-07-20 15:02:24 -04:00
|
|
|
|
2015-07-10 17:33:24 -04:00
|
|
|
imgSelectOptions = {
|
|
|
|
handles: true,
|
|
|
|
keys: true,
|
|
|
|
instance: true,
|
|
|
|
persistent: true,
|
|
|
|
imageWidth: realWidth,
|
|
|
|
imageHeight: realHeight,
|
2016-04-07 21:23:29 -04:00
|
|
|
minWidth: xImg > xInit ? xInit : xImg,
|
|
|
|
minHeight: yImg > yInit ? yInit : yImg,
|
2015-07-20 15:02:24 -04:00
|
|
|
x1: x1,
|
|
|
|
y1: y1,
|
|
|
|
x2: xInit + x1,
|
|
|
|
y2: yInit + y1
|
2015-07-10 17:33:24 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
if ( flexHeight === false && flexWidth === false ) {
|
|
|
|
imgSelectOptions.aspectRatio = xInit + ':' + yInit;
|
|
|
|
}
|
2016-04-07 21:23:29 -04:00
|
|
|
|
|
|
|
if ( true === flexHeight ) {
|
|
|
|
delete imgSelectOptions.minHeight;
|
|
|
|
imgSelectOptions.maxWidth = realWidth;
|
2015-07-10 17:33:24 -04:00
|
|
|
}
|
2016-04-07 21:23:29 -04:00
|
|
|
|
|
|
|
if ( true === flexWidth ) {
|
|
|
|
delete imgSelectOptions.minWidth;
|
|
|
|
imgSelectOptions.maxHeight = realHeight;
|
2015-07-10 17:33:24 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return imgSelectOptions;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return whether the image must be cropped, based on required dimensions.
|
|
|
|
*
|
|
|
|
* @param {bool} flexW
|
|
|
|
* @param {bool} flexH
|
|
|
|
* @param {int} dstW
|
|
|
|
* @param {int} dstH
|
|
|
|
* @param {int} imgW
|
|
|
|
* @param {int} imgH
|
|
|
|
* @return {bool}
|
|
|
|
*/
|
|
|
|
mustBeCropped: function( flexW, flexH, dstW, dstH, imgW, imgH ) {
|
|
|
|
if ( true === flexW && true === flexH ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( true === flexW && dstH === imgH ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( true === flexH && dstW === imgW ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( dstW === imgW && dstH === imgH ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( imgW <= dstW ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If cropping was skipped, apply the image data directly to the setting.
|
|
|
|
*/
|
|
|
|
onSkippedCrop: function() {
|
|
|
|
var attachment = this.frame.state().get( 'selection' ).first().toJSON();
|
|
|
|
this.setImageFromAttachment( attachment );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Updates the setting and re-renders the control UI.
|
|
|
|
*
|
|
|
|
* @param {object} attachment
|
|
|
|
*/
|
|
|
|
setImageFromAttachment: function( attachment ) {
|
|
|
|
this.params.attachment = attachment;
|
|
|
|
|
|
|
|
// Set the Customizer setting; the callback takes care of rendering.
|
|
|
|
this.setting( attachment.id );
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A control for selecting and cropping Site Icons.
|
|
|
|
*
|
|
|
|
* @class
|
|
|
|
* @augments wp.customize.CroppedImageControl
|
|
|
|
* @augments wp.customize.MediaControl
|
|
|
|
* @augments wp.customize.Control
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
|
|
|
api.SiteIconControl = api.CroppedImageControl.extend({
|
2015-07-20 11:57:25 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a media modal select frame, and store it so the instance can be reused when needed.
|
|
|
|
*/
|
|
|
|
initFrame: function() {
|
|
|
|
var l10n = _wpMediaViewsL10n;
|
|
|
|
|
|
|
|
this.frame = wp.media({
|
|
|
|
button: {
|
|
|
|
text: l10n.select,
|
|
|
|
close: false
|
|
|
|
},
|
|
|
|
states: [
|
|
|
|
new wp.media.controller.Library({
|
|
|
|
title: this.params.button_labels.frame_title,
|
|
|
|
library: wp.media.query({ type: 'image' }),
|
|
|
|
multiple: false,
|
|
|
|
date: false,
|
|
|
|
priority: 20,
|
|
|
|
suggestedWidth: this.params.width,
|
|
|
|
suggestedHeight: this.params.height
|
|
|
|
}),
|
|
|
|
new wp.media.controller.SiteIconCropper({
|
|
|
|
imgSelectOptions: this.calculateImageSelectOptions,
|
|
|
|
control: this
|
|
|
|
})
|
|
|
|
]
|
|
|
|
});
|
|
|
|
|
|
|
|
this.frame.on( 'select', this.onSelect, this );
|
|
|
|
this.frame.on( 'cropped', this.onCropped, this );
|
|
|
|
this.frame.on( 'skippedcrop', this.onSkippedCrop, this );
|
|
|
|
},
|
|
|
|
|
2015-07-21 22:30:25 -04:00
|
|
|
/**
|
|
|
|
* After an image is selected in the media modal, switch to the cropper
|
|
|
|
* state if the image isn't the right size.
|
|
|
|
*/
|
|
|
|
onSelect: function() {
|
|
|
|
var attachment = this.frame.state().get( 'selection' ).first().toJSON(),
|
|
|
|
controller = this;
|
|
|
|
|
|
|
|
if ( this.params.width === attachment.width && this.params.height === attachment.height && ! this.params.flex_width && ! this.params.flex_height ) {
|
|
|
|
wp.ajax.post( 'crop-image', {
|
|
|
|
nonce: attachment.nonces.edit,
|
|
|
|
id: attachment.id,
|
|
|
|
context: 'site-icon',
|
|
|
|
cropDetails: {
|
|
|
|
x1: 0,
|
|
|
|
y1: 0,
|
|
|
|
width: this.params.width,
|
|
|
|
height: this.params.height,
|
|
|
|
dst_width: this.params.width,
|
|
|
|
dst_height: this.params.height
|
|
|
|
}
|
|
|
|
} ).done( function( croppedImage ) {
|
|
|
|
controller.setImageFromAttachment( croppedImage );
|
|
|
|
controller.frame.close();
|
|
|
|
} ).fail( function() {
|
2016-07-04 16:45:28 -04:00
|
|
|
controller.frame.trigger('content:error:crop');
|
2015-07-21 22:30:25 -04:00
|
|
|
} );
|
|
|
|
} else {
|
|
|
|
this.frame.setState( 'cropper' );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2015-07-10 17:33:24 -04:00
|
|
|
/**
|
|
|
|
* Updates the setting and re-renders the control UI.
|
|
|
|
*
|
|
|
|
* @param {object} attachment
|
|
|
|
*/
|
|
|
|
setImageFromAttachment: function( attachment ) {
|
2016-10-25 00:47:29 -04:00
|
|
|
var sizes = [ 'site_icon-32', 'thumbnail', 'full' ], link,
|
2015-09-11 16:13:25 -04:00
|
|
|
icon;
|
|
|
|
|
|
|
|
_.each( sizes, function( size ) {
|
|
|
|
if ( ! icon && ! _.isUndefined ( attachment.sizes[ size ] ) ) {
|
|
|
|
icon = attachment.sizes[ size ];
|
|
|
|
}
|
|
|
|
} );
|
2015-07-10 17:33:24 -04:00
|
|
|
|
|
|
|
this.params.attachment = attachment;
|
|
|
|
|
|
|
|
// Set the Customizer setting; the callback takes care of rendering.
|
|
|
|
this.setting( attachment.id );
|
|
|
|
|
2016-10-25 00:47:29 -04:00
|
|
|
if ( ! icon ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-07-10 17:33:24 -04:00
|
|
|
// Update the icon in-browser.
|
2016-10-25 00:47:29 -04:00
|
|
|
link = $( 'link[rel="icon"][sizes="32x32"]' );
|
|
|
|
link.attr( 'href', icon.url );
|
2015-07-10 17:33:24 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called when the "Remove" link is clicked. Empties the setting.
|
|
|
|
*
|
|
|
|
* @param {object} event jQuery Event object
|
|
|
|
*/
|
|
|
|
removeFile: function( event ) {
|
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
event.preventDefault();
|
|
|
|
|
|
|
|
this.params.attachment = {};
|
|
|
|
this.setting( '' );
|
|
|
|
this.renderContent(); // Not bound to setting change when emptying.
|
2016-10-25 00:47:29 -04:00
|
|
|
$( 'link[rel="icon"][sizes="32x32"]' ).attr( 'href', '/favicon.ico' ); // Set to default.
|
2015-07-10 17:33:24 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2014-08-08 19:31:15 -04:00
|
|
|
/**
|
2014-11-11 18:52:22 -05:00
|
|
|
* @class
|
2014-08-08 19:31:15 -04:00
|
|
|
* @augments wp.customize.Control
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
2014-03-11 00:13:16 -04:00
|
|
|
api.HeaderControl = api.Control.extend({
|
|
|
|
ready: function() {
|
2015-03-10 14:02:28 -04:00
|
|
|
this.btnRemove = $('#customize-control-header_image .actions .remove');
|
|
|
|
this.btnNew = $('#customize-control-header_image .actions .new');
|
2014-03-11 00:13:16 -04:00
|
|
|
|
|
|
|
_.bindAll(this, 'openMedia', 'removeImage');
|
|
|
|
|
|
|
|
this.btnNew.on( 'click', this.openMedia );
|
|
|
|
this.btnRemove.on( 'click', this.removeImage );
|
|
|
|
|
2015-04-08 18:28:27 -04:00
|
|
|
api.HeaderTool.currentHeader = this.getInitialHeaderImage();
|
2014-03-11 00:13:16 -04:00
|
|
|
|
|
|
|
new api.HeaderTool.CurrentView({
|
|
|
|
model: api.HeaderTool.currentHeader,
|
2014-12-02 16:55:23 -05:00
|
|
|
el: '#customize-control-header_image .current .container'
|
2014-03-11 00:13:16 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
new api.HeaderTool.ChoiceListView({
|
|
|
|
collection: api.HeaderTool.UploadsList = new api.HeaderTool.ChoiceList(),
|
2014-12-02 16:55:23 -05:00
|
|
|
el: '#customize-control-header_image .choices .uploaded .list'
|
2014-03-11 00:13:16 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
new api.HeaderTool.ChoiceListView({
|
|
|
|
collection: api.HeaderTool.DefaultsList = new api.HeaderTool.DefaultsList(),
|
2014-12-02 16:55:23 -05:00
|
|
|
el: '#customize-control-header_image .choices .default .list'
|
2014-03-11 00:13:16 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
api.HeaderTool.combinedList = api.HeaderTool.CombinedList = new api.HeaderTool.CombinedList([
|
|
|
|
api.HeaderTool.UploadsList,
|
|
|
|
api.HeaderTool.DefaultsList
|
|
|
|
]);
|
2016-03-05 20:45:27 -05:00
|
|
|
|
|
|
|
// Ensure custom-header-crop Ajax requests bootstrap the Customizer to activate the previewed theme.
|
|
|
|
wp.media.controller.Cropper.prototype.defaults.doCropArgs.wp_customize = 'on';
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
wp.media.controller.Cropper.prototype.defaults.doCropArgs.customize_theme = api.settings.theme.stylesheet;
|
2014-03-11 00:13:16 -04:00
|
|
|
},
|
|
|
|
|
2015-04-08 18:28:27 -04:00
|
|
|
/**
|
|
|
|
* Returns a new instance of api.HeaderTool.ImageModel based on the currently
|
|
|
|
* saved header image (if any).
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*
|
|
|
|
* @returns {Object} Options
|
|
|
|
*/
|
|
|
|
getInitialHeaderImage: function() {
|
|
|
|
if ( ! api.get().header_image || ! api.get().header_image_data || _.contains( [ 'remove-header', 'random-default-image', 'random-uploaded-image' ], api.get().header_image ) ) {
|
|
|
|
return new api.HeaderTool.ImageModel();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the matching uploaded image object.
|
|
|
|
var currentHeaderObject = _.find( _wpCustomizeHeader.uploads, function( imageObj ) {
|
|
|
|
return ( imageObj.attachment_id === api.get().header_image_data.attachment_id );
|
|
|
|
} );
|
|
|
|
// Fall back to raw current header image.
|
|
|
|
if ( ! currentHeaderObject ) {
|
|
|
|
currentHeaderObject = {
|
|
|
|
url: api.get().header_image,
|
|
|
|
thumbnail_url: api.get().header_image,
|
|
|
|
attachment_id: api.get().header_image_data.attachment_id
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return new api.HeaderTool.ImageModel({
|
|
|
|
header: currentHeaderObject,
|
|
|
|
choice: currentHeaderObject.url.split( '/' ).pop()
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2014-03-11 00:13:16 -04:00
|
|
|
/**
|
|
|
|
* Returns a set of options, computed from the attached image data and
|
|
|
|
* theme-specific data, to be fed to the imgAreaSelect plugin in
|
|
|
|
* wp.media.view.Cropper.
|
|
|
|
*
|
|
|
|
* @param {wp.media.model.Attachment} attachment
|
|
|
|
* @param {wp.media.controller.Cropper} controller
|
|
|
|
* @returns {Object} Options
|
|
|
|
*/
|
|
|
|
calculateImageSelectOptions: function(attachment, controller) {
|
|
|
|
var xInit = parseInt(_wpCustomizeHeader.data.width, 10),
|
|
|
|
yInit = parseInt(_wpCustomizeHeader.data.height, 10),
|
|
|
|
flexWidth = !! parseInt(_wpCustomizeHeader.data['flex-width'], 10),
|
|
|
|
flexHeight = !! parseInt(_wpCustomizeHeader.data['flex-height'], 10),
|
|
|
|
ratio, xImg, yImg, realHeight, realWidth,
|
|
|
|
imgSelectOptions;
|
|
|
|
|
|
|
|
realWidth = attachment.get('width');
|
|
|
|
realHeight = attachment.get('height');
|
|
|
|
|
|
|
|
this.headerImage = new api.HeaderTool.ImageModel();
|
|
|
|
this.headerImage.set({
|
|
|
|
themeWidth: xInit,
|
|
|
|
themeHeight: yInit,
|
|
|
|
themeFlexWidth: flexWidth,
|
|
|
|
themeFlexHeight: flexHeight,
|
|
|
|
imageWidth: realWidth,
|
|
|
|
imageHeight: realHeight
|
|
|
|
});
|
|
|
|
|
|
|
|
controller.set( 'canSkipCrop', ! this.headerImage.shouldBeCropped() );
|
|
|
|
|
|
|
|
ratio = xInit / yInit;
|
|
|
|
xImg = realWidth;
|
|
|
|
yImg = realHeight;
|
|
|
|
|
|
|
|
if ( xImg / yImg > ratio ) {
|
|
|
|
yInit = yImg;
|
|
|
|
xInit = yInit * ratio;
|
|
|
|
} else {
|
|
|
|
xInit = xImg;
|
|
|
|
yInit = xInit / ratio;
|
|
|
|
}
|
|
|
|
|
|
|
|
imgSelectOptions = {
|
|
|
|
handles: true,
|
|
|
|
keys: true,
|
|
|
|
instance: true,
|
|
|
|
persistent: true,
|
|
|
|
imageWidth: realWidth,
|
|
|
|
imageHeight: realHeight,
|
|
|
|
x1: 0,
|
|
|
|
y1: 0,
|
|
|
|
x2: xInit,
|
|
|
|
y2: yInit
|
|
|
|
};
|
|
|
|
|
|
|
|
if (flexHeight === false && flexWidth === false) {
|
|
|
|
imgSelectOptions.aspectRatio = xInit + ':' + yInit;
|
|
|
|
}
|
|
|
|
if (flexHeight === false ) {
|
|
|
|
imgSelectOptions.maxHeight = yInit;
|
|
|
|
}
|
|
|
|
if (flexWidth === false ) {
|
|
|
|
imgSelectOptions.maxWidth = xInit;
|
|
|
|
}
|
|
|
|
|
|
|
|
return imgSelectOptions;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets up and opens the Media Manager in order to select an image.
|
|
|
|
* Depending on both the size of the image and the properties of the
|
|
|
|
* current theme, a cropping step after selection may be required or
|
|
|
|
* skippable.
|
|
|
|
*
|
|
|
|
* @param {event} event
|
|
|
|
*/
|
|
|
|
openMedia: function(event) {
|
2014-04-07 21:55:15 -04:00
|
|
|
var l10n = _wpMediaViewsL10n;
|
2014-03-11 00:13:16 -04:00
|
|
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
|
|
|
this.frame = wp.media({
|
|
|
|
button: {
|
|
|
|
text: l10n.selectAndCrop,
|
|
|
|
close: false
|
|
|
|
},
|
2014-04-07 21:57:16 -04:00
|
|
|
states: [
|
|
|
|
new wp.media.controller.Library({
|
|
|
|
title: l10n.chooseImage,
|
|
|
|
library: wp.media.query({ type: 'image' }),
|
|
|
|
multiple: false,
|
2014-12-15 15:27:22 -05:00
|
|
|
date: false,
|
2014-04-07 21:57:16 -04:00
|
|
|
priority: 20,
|
|
|
|
suggestedWidth: _wpCustomizeHeader.data.width,
|
|
|
|
suggestedHeight: _wpCustomizeHeader.data.height
|
|
|
|
}),
|
|
|
|
new wp.media.controller.Cropper({
|
|
|
|
imgSelectOptions: this.calculateImageSelectOptions
|
|
|
|
})
|
|
|
|
]
|
2014-03-11 00:13:16 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
this.frame.on('select', this.onSelect, this);
|
|
|
|
this.frame.on('cropped', this.onCropped, this);
|
|
|
|
this.frame.on('skippedcrop', this.onSkippedCrop, this);
|
|
|
|
|
|
|
|
this.frame.open();
|
|
|
|
},
|
|
|
|
|
2014-11-11 18:52:22 -05:00
|
|
|
/**
|
|
|
|
* After an image is selected in the media modal,
|
|
|
|
* switch to the cropper state.
|
|
|
|
*/
|
2014-03-11 00:13:16 -04:00
|
|
|
onSelect: function() {
|
|
|
|
this.frame.setState('cropper');
|
|
|
|
},
|
2014-11-11 18:52:22 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
* After the image has been cropped, apply the cropped image data to the setting.
|
|
|
|
*
|
|
|
|
* @param {object} croppedImage Cropped attachment data.
|
|
|
|
*/
|
2014-03-11 00:13:16 -04:00
|
|
|
onCropped: function(croppedImage) {
|
2015-09-15 10:46:32 -04:00
|
|
|
var url = croppedImage.url,
|
2014-03-11 00:13:16 -04:00
|
|
|
attachmentId = croppedImage.attachment_id,
|
|
|
|
w = croppedImage.width,
|
|
|
|
h = croppedImage.height;
|
|
|
|
this.setImageFromURL(url, attachmentId, w, h);
|
|
|
|
},
|
2014-11-11 18:52:22 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
* If cropping was skipped, apply the image data directly to the setting.
|
|
|
|
*
|
|
|
|
* @param {object} selection
|
|
|
|
*/
|
2014-03-11 00:13:16 -04:00
|
|
|
onSkippedCrop: function(selection) {
|
|
|
|
var url = selection.get('url'),
|
|
|
|
w = selection.get('width'),
|
|
|
|
h = selection.get('height');
|
|
|
|
this.setImageFromURL(url, selection.id, w, h);
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a new wp.customize.HeaderTool.ImageModel from provided
|
|
|
|
* header image data and inserts it into the user-uploaded headers
|
|
|
|
* collection.
|
|
|
|
*
|
|
|
|
* @param {String} url
|
|
|
|
* @param {Number} attachmentId
|
|
|
|
* @param {Number} width
|
|
|
|
* @param {Number} height
|
|
|
|
*/
|
|
|
|
setImageFromURL: function(url, attachmentId, width, height) {
|
|
|
|
var choice, data = {};
|
|
|
|
|
|
|
|
data.url = url;
|
|
|
|
data.thumbnail_url = url;
|
2014-04-13 14:22:14 -04:00
|
|
|
data.timestamp = _.now();
|
2014-03-11 00:13:16 -04:00
|
|
|
|
|
|
|
if (attachmentId) {
|
|
|
|
data.attachment_id = attachmentId;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (width) {
|
|
|
|
data.width = width;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (height) {
|
|
|
|
data.height = height;
|
|
|
|
}
|
|
|
|
|
|
|
|
choice = new api.HeaderTool.ImageModel({
|
|
|
|
header: data,
|
|
|
|
choice: url.split('/').pop()
|
|
|
|
});
|
|
|
|
api.HeaderTool.UploadsList.add(choice);
|
|
|
|
api.HeaderTool.currentHeader.set(choice.toJSON());
|
|
|
|
choice.save();
|
|
|
|
choice.importImage();
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Triggers the necessary events to deselect an image which was set as
|
|
|
|
* the currently selected one.
|
|
|
|
*/
|
|
|
|
removeImage: function() {
|
|
|
|
api.HeaderTool.currentHeader.trigger('hide');
|
|
|
|
api.HeaderTool.CombinedList.trigger('control:removeImage');
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2015-02-24 15:31:24 -05:00
|
|
|
/**
|
|
|
|
* wp.customize.ThemeControl
|
|
|
|
*
|
|
|
|
* @constructor
|
|
|
|
* @augments wp.customize.Control
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
*/
|
|
|
|
api.ThemeControl = api.Control.extend({
|
|
|
|
|
2015-03-27 18:54:29 -04:00
|
|
|
touchDrag: false,
|
2016-11-04 13:18:26 -04:00
|
|
|
isRendered: false,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Defer rendering the theme control until the section is displayed.
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
renderContent: function () {
|
|
|
|
var control = this,
|
|
|
|
renderContentArgs = arguments;
|
|
|
|
|
|
|
|
api.section( control.section(), function( section ) {
|
|
|
|
if ( section.expanded() ) {
|
|
|
|
api.Control.prototype.renderContent.apply( control, renderContentArgs );
|
|
|
|
control.isRendered = true;
|
|
|
|
} else {
|
|
|
|
section.expanded.bind( function( expanded ) {
|
|
|
|
if ( expanded && ! control.isRendered ) {
|
|
|
|
api.Control.prototype.renderContent.apply( control, renderContentArgs );
|
|
|
|
control.isRendered = true;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
},
|
2015-03-31 18:21:25 -04:00
|
|
|
|
2015-02-24 15:31:24 -05:00
|
|
|
/**
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
ready: function() {
|
|
|
|
var control = this;
|
|
|
|
|
2015-03-27 18:54:29 -04:00
|
|
|
control.container.on( 'touchmove', '.theme', function() {
|
|
|
|
control.touchDrag = true;
|
|
|
|
});
|
|
|
|
|
2015-02-24 15:31:24 -05:00
|
|
|
// Bind details view trigger.
|
2015-03-27 18:54:29 -04:00
|
|
|
control.container.on( 'click keydown touchend', '.theme', function( event ) {
|
2015-02-24 15:31:24 -05:00
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-03-27 18:54:29 -04:00
|
|
|
// Bail if the user scrolled on a touch device.
|
|
|
|
if ( control.touchDrag === true ) {
|
|
|
|
return control.touchDrag = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Prevent the modal from showing when the user clicks the action button.
|
2016-11-04 13:18:26 -04:00
|
|
|
if ( $( event.target ).is( '.theme-actions .button' ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
api.section( control.section() ).loadThemePreview( control.params.theme.id );
|
|
|
|
});
|
|
|
|
|
|
|
|
control.container.on( 'click keydown', '.theme-actions .theme-details', function( event ) {
|
|
|
|
if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
|
2015-02-24 15:31:24 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-04-01 08:36:26 -04:00
|
|
|
event.preventDefault(); // Keep this AFTER the key filter above
|
2016-11-04 13:18:26 -04:00
|
|
|
|
2015-04-01 08:36:26 -04:00
|
|
|
api.section( control.section() ).showDetails( control.params.theme );
|
2015-02-24 15:31:24 -05:00
|
|
|
});
|
2015-04-08 16:52:29 -04:00
|
|
|
|
|
|
|
control.container.on( 'render-screenshot', function() {
|
|
|
|
var $screenshot = $( this ).find( 'img' ),
|
|
|
|
source = $screenshot.data( 'src' );
|
|
|
|
|
|
|
|
if ( source ) {
|
|
|
|
$screenshot.attr( 'src', source );
|
|
|
|
}
|
|
|
|
});
|
2015-02-24 15:31:24 -05:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2016-11-04 13:18:26 -04:00
|
|
|
* Show or hide the theme based on the presence of the term in the title, description, and author.
|
2015-02-24 15:31:24 -05:00
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*/
|
|
|
|
filter: function( term ) {
|
|
|
|
var control = this,
|
2015-04-08 16:52:29 -04:00
|
|
|
haystack = control.params.theme.name + ' ' +
|
|
|
|
control.params.theme.description + ' ' +
|
|
|
|
control.params.theme.tags + ' ' +
|
|
|
|
control.params.theme.author;
|
2015-02-24 15:31:24 -05:00
|
|
|
haystack = haystack.toLowerCase().replace( '-', ' ' );
|
|
|
|
if ( -1 !== haystack.search( term ) ) {
|
|
|
|
control.activate();
|
|
|
|
} else {
|
|
|
|
control.deactivate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Change objects contained within the main customize object to Settings.
|
|
|
|
api.defaultConstructor = api.Setting;
|
|
|
|
|
2014-12-03 21:04:22 -05:00
|
|
|
// Create the collections for Controls, Sections and Panels.
|
2012-08-22 20:04:18 -04:00
|
|
|
api.control = new api.Values({ defaultConstructor: api.Control });
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
api.section = new api.Values({ defaultConstructor: api.Section });
|
|
|
|
api.panel = new api.Values({ defaultConstructor: api.Panel });
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-08-08 19:31:15 -04:00
|
|
|
/**
|
2015-09-05 15:53:24 -04:00
|
|
|
* An object that fetches a preview in the background of the document, which
|
|
|
|
* allows for seamless replacement of an existing preview.
|
|
|
|
*
|
2014-11-11 18:52:22 -05:00
|
|
|
* @class
|
2014-08-08 19:31:15 -04:00
|
|
|
* @augments wp.customize.Messenger
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
* @mixes wp.customize.Events
|
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
api.PreviewFrame = api.Messenger.extend({
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
sensitivity: null, // Will get set to api.settings.timeouts.previewFrameSensitivity.
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-09-05 15:53:24 -04:00
|
|
|
/**
|
|
|
|
* Initialize the PreviewFrame.
|
|
|
|
*
|
|
|
|
* @param {object} params.container
|
|
|
|
* @param {object} params.previewUrl
|
|
|
|
* @param {object} params.query
|
|
|
|
* @param {object} options
|
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
initialize: function( params, options ) {
|
2013-11-15 01:08:10 -05:00
|
|
|
var deferred = $.Deferred();
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-09-05 15:53:24 -04:00
|
|
|
/*
|
|
|
|
* Make the instance of the PreviewFrame the promise object
|
|
|
|
* so other objects can easily interact with it.
|
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
deferred.promise( this );
|
|
|
|
|
|
|
|
this.container = params.container;
|
|
|
|
|
|
|
|
$.extend( params, { channel: api.PreviewFrame.uuid() });
|
|
|
|
|
|
|
|
api.Messenger.prototype.initialize.call( this, params, options );
|
|
|
|
|
|
|
|
this.add( 'previewUrl', params.previewUrl );
|
|
|
|
|
|
|
|
this.query = $.extend( params.query || {}, { customize_messenger_channel: this.channel() });
|
|
|
|
|
|
|
|
this.run( deferred );
|
|
|
|
},
|
|
|
|
|
2015-09-05 15:53:24 -04:00
|
|
|
/**
|
|
|
|
* Run the preview request.
|
|
|
|
*
|
|
|
|
* @param {object} deferred jQuery Deferred object to be resolved with
|
|
|
|
* the request.
|
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
run: function( deferred ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
var previewFrame = this,
|
2012-08-22 20:04:18 -04:00
|
|
|
loaded = false,
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
ready = false,
|
|
|
|
readyData = null,
|
|
|
|
hasPendingChangesetUpdate = '{}' !== previewFrame.query.customized,
|
|
|
|
urlParser,
|
|
|
|
params,
|
|
|
|
form;
|
|
|
|
|
|
|
|
if ( previewFrame._ready ) {
|
|
|
|
previewFrame.unbind( 'ready', previewFrame._ready );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewFrame._ready = function( data ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
ready = true;
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
readyData = data;
|
|
|
|
previewFrame.container.addClass( 'iframe-ready' );
|
|
|
|
if ( ! data ) {
|
|
|
|
return;
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
if ( loaded ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
deferred.resolveWith( previewFrame, [ data ] );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
};
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewFrame.bind( 'ready', previewFrame._ready );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
urlParser = document.createElement( 'a' );
|
|
|
|
urlParser.href = previewFrame.previewUrl();
|
2015-03-10 11:56:26 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
params = _.extend(
|
|
|
|
api.utils.parseQueryString( urlParser.search.substr( 1 ) ),
|
|
|
|
{
|
|
|
|
customize_changeset_uuid: previewFrame.query.customize_changeset_uuid,
|
|
|
|
customize_theme: previewFrame.query.customize_theme,
|
|
|
|
customize_messenger_channel: previewFrame.query.customize_messenger_channel
|
2014-07-09 19:58:16 -04:00
|
|
|
}
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
);
|
2014-07-09 19:58:16 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
urlParser.search = $.param( params );
|
|
|
|
previewFrame.iframe = $( '<iframe />', {
|
|
|
|
title: api.l10n.previewIframeTitle,
|
|
|
|
name: 'customize-' + previewFrame.channel()
|
2014-07-09 19:58:16 -04:00
|
|
|
} );
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewFrame.iframe.attr( 'onmousewheel', '' ); // Workaround for Safari bug. See WP Trac #38149.
|
2014-07-09 19:58:16 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( ! hasPendingChangesetUpdate ) {
|
|
|
|
previewFrame.iframe.attr( 'src', urlParser.href );
|
|
|
|
} else {
|
|
|
|
previewFrame.iframe.attr( 'data-src', urlParser.href ); // For debugging purposes.
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewFrame.iframe.appendTo( previewFrame.container );
|
|
|
|
previewFrame.targetWindow( previewFrame.iframe[0].contentWindow );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
/*
|
|
|
|
* Submit customized data in POST request to preview frame window since
|
|
|
|
* there are setting value changes not yet written to changeset.
|
|
|
|
*/
|
|
|
|
if ( hasPendingChangesetUpdate ) {
|
|
|
|
form = $( '<form>', {
|
|
|
|
action: urlParser.href,
|
|
|
|
target: previewFrame.iframe.attr( 'name' ),
|
|
|
|
method: 'post',
|
|
|
|
hidden: 'hidden'
|
|
|
|
} );
|
|
|
|
form.append( $( '<input>', {
|
|
|
|
type: 'hidden',
|
|
|
|
name: '_method',
|
|
|
|
value: 'GET'
|
|
|
|
} ) );
|
|
|
|
_.each( previewFrame.query, function( value, key ) {
|
|
|
|
form.append( $( '<input>', {
|
|
|
|
type: 'hidden',
|
|
|
|
name: key,
|
|
|
|
value: value
|
|
|
|
} ) );
|
|
|
|
} );
|
|
|
|
previewFrame.container.append( form );
|
|
|
|
form.submit();
|
|
|
|
form.remove(); // No need to keep the form around after submitted.
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewFrame.bind( 'iframe-loading-error', function( error ) {
|
|
|
|
previewFrame.iframe.remove();
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
// Check if the user is not logged in.
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( 0 === error ) {
|
|
|
|
previewFrame.login( deferred );
|
2012-08-22 20:04:18 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check for cheaters.
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( -1 === error ) {
|
|
|
|
deferred.rejectWith( previewFrame, [ 'cheatin' ] );
|
2012-08-22 20:04:18 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
deferred.rejectWith( previewFrame, [ 'request failure' ] );
|
|
|
|
} );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewFrame.iframe.one( 'load', function() {
|
|
|
|
loaded = true;
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( ready ) {
|
|
|
|
deferred.resolveWith( previewFrame, [ readyData ] );
|
|
|
|
} else {
|
|
|
|
setTimeout( function() {
|
|
|
|
deferred.rejectWith( previewFrame, [ 'ready timeout' ] );
|
|
|
|
}, previewFrame.sensitivity );
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
login: function( deferred ) {
|
|
|
|
var self = this,
|
|
|
|
reject;
|
|
|
|
|
|
|
|
reject = function() {
|
|
|
|
deferred.rejectWith( self, [ 'logged out' ] );
|
|
|
|
};
|
|
|
|
|
2015-03-10 17:20:26 -04:00
|
|
|
if ( this.triedLogin ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
return reject();
|
2015-03-10 17:20:26 -04:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
// Check if we have an admin cookie.
|
|
|
|
$.get( api.settings.url.ajax, {
|
|
|
|
action: 'logged-in'
|
|
|
|
}).fail( reject ).done( function( response ) {
|
|
|
|
var iframe;
|
|
|
|
|
2015-03-10 17:20:26 -04:00
|
|
|
if ( '1' !== response ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
reject();
|
2015-03-10 17:20:26 -04:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-03-10 17:20:26 -04:00
|
|
|
iframe = $( '<iframe />', { 'src': self.previewUrl(), 'title': api.l10n.previewIframeTitle } ).hide();
|
2012-08-22 20:04:18 -04:00
|
|
|
iframe.appendTo( self.container );
|
2016-01-13 12:22:27 -05:00
|
|
|
iframe.on( 'load', function() {
|
2012-08-22 20:04:18 -04:00
|
|
|
self.triedLogin = true;
|
|
|
|
|
|
|
|
iframe.remove();
|
|
|
|
self.run( deferred );
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
destroy: function() {
|
|
|
|
api.Messenger.prototype.destroy.call( this );
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( this.iframe ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
this.iframe.remove();
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
delete this.iframe;
|
|
|
|
delete this.targetWindow;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
(function(){
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
var id = 0;
|
2014-08-08 19:31:15 -04:00
|
|
|
/**
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
* Return an incremented ID for a preview messenger channel.
|
|
|
|
*
|
|
|
|
* This function is named "uuid" for historical reasons, but it is a
|
|
|
|
* misnomer as it is not an actual UUID, and it is not universally unique.
|
|
|
|
* This is not to be confused with `api.settings.changeset.uuid`.
|
2014-08-08 19:31:15 -04:00
|
|
|
*
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
* @return {string}
|
2014-08-08 19:31:15 -04:00
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
api.PreviewFrame.uuid = function() {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
return 'preview-' + String( id++ );
|
2012-08-22 20:04:18 -04:00
|
|
|
};
|
|
|
|
}());
|
|
|
|
|
2014-11-11 17:29:23 -05:00
|
|
|
/**
|
2014-12-03 21:04:22 -05:00
|
|
|
* Set the document title of the customizer.
|
|
|
|
*
|
|
|
|
* @since 4.1.0
|
2014-11-11 17:29:23 -05:00
|
|
|
*
|
|
|
|
* @param {string} documentTitle
|
|
|
|
*/
|
|
|
|
api.setDocumentTitle = function ( documentTitle ) {
|
|
|
|
var tmpl, title;
|
|
|
|
tmpl = api.settings.documentTitleTmpl;
|
|
|
|
title = tmpl.replace( '%s', documentTitle );
|
|
|
|
document.title = title;
|
2015-03-25 13:26:26 -04:00
|
|
|
api.trigger( 'title', title );
|
2014-11-11 17:29:23 -05:00
|
|
|
};
|
|
|
|
|
2014-08-08 19:31:15 -04:00
|
|
|
/**
|
2014-11-11 18:52:22 -05:00
|
|
|
* @class
|
2014-08-08 19:31:15 -04:00
|
|
|
* @augments wp.customize.Messenger
|
|
|
|
* @augments wp.customize.Class
|
|
|
|
* @mixes wp.customize.Events
|
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
api.Previewer = api.Messenger.extend({
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
refreshBuffer: null, // Will get set to api.settings.timeouts.windowRefresh.
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
/**
|
2015-09-05 15:53:24 -04:00
|
|
|
* @param {array} params.allowedUrls
|
|
|
|
* @param {string} params.container A selector or jQuery element for the preview
|
|
|
|
* frame to be placed.
|
|
|
|
* @param {string} params.form
|
|
|
|
* @param {string} params.previewUrl The URL to preview.
|
|
|
|
* @param {object} options
|
2012-08-22 20:04:18 -04:00
|
|
|
*/
|
|
|
|
initialize: function( params, options ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
var previewer = this,
|
|
|
|
urlParser = document.createElement( 'a' );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
$.extend( previewer, options || {} );
|
|
|
|
previewer.deferred = {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
active: $.Deferred()
|
|
|
|
};
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
// Debounce to prevent hammering server and then wait for any pending update requests.
|
|
|
|
previewer.refresh = _.debounce(
|
|
|
|
( function( originalRefresh ) {
|
|
|
|
return function() {
|
|
|
|
var isProcessingComplete, refreshOnceProcessingComplete;
|
|
|
|
isProcessingComplete = function() {
|
|
|
|
return 0 === api.state( 'processing' ).get();
|
|
|
|
};
|
|
|
|
if ( isProcessingComplete() ) {
|
|
|
|
originalRefresh.call( previewer );
|
2012-08-22 20:04:18 -04:00
|
|
|
} else {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
refreshOnceProcessingComplete = function() {
|
|
|
|
if ( isProcessingComplete() ) {
|
|
|
|
originalRefresh.call( previewer );
|
|
|
|
api.state( 'processing' ).unbind( refreshOnceProcessingComplete );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
api.state( 'processing' ).bind( refreshOnceProcessingComplete );
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
};
|
|
|
|
}( previewer.refresh ) ),
|
|
|
|
previewer.refreshBuffer
|
|
|
|
);
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.container = api.ensure( params.container );
|
|
|
|
previewer.allowedUrls = params.allowedUrls;
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
params.url = window.location.href;
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
api.Messenger.prototype.initialize.call( previewer, params );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
urlParser.href = previewer.origin();
|
|
|
|
previewer.add( 'scheme', urlParser.protocol.replace( /:$/, '' ) );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
// Limit the URL to internal, front-end links.
|
|
|
|
//
|
2016-02-25 07:53:27 -05:00
|
|
|
// If the front end and the admin are served from the same domain, load the
|
2014-10-15 13:21:19 -04:00
|
|
|
// preview over ssl if the Customizer is being loaded over ssl. This avoids
|
2016-02-25 07:53:27 -05:00
|
|
|
// insecure content warnings. This is not attempted if the admin and front end
|
|
|
|
// are on different domains to avoid the case where the front end doesn't have
|
2012-08-22 20:04:18 -04:00
|
|
|
// ssl certs.
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.add( 'previewUrl', params.previewUrl ).setter( function( to ) {
|
2016-10-24 16:07:31 -04:00
|
|
|
var result = null, urlParser, queryParams, parsedAllowedUrl, parsedCandidateUrls = [];
|
2016-08-27 02:05:29 -04:00
|
|
|
urlParser = document.createElement( 'a' );
|
|
|
|
urlParser.href = to;
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2016-08-27 02:05:29 -04:00
|
|
|
// Abort if URL is for admin or (static) files in wp-includes or wp-content.
|
|
|
|
if ( /\/wp-(admin|includes|content)(\/|$)/.test( urlParser.pathname ) ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
return null;
|
2016-08-27 02:05:29 -04:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
// Remove state query params.
|
|
|
|
if ( urlParser.search.length > 1 ) {
|
|
|
|
queryParams = api.utils.parseQueryString( urlParser.search.substr( 1 ) );
|
|
|
|
delete queryParams.customize_changeset_uuid;
|
|
|
|
delete queryParams.customize_theme;
|
|
|
|
delete queryParams.customize_messenger_channel;
|
|
|
|
if ( _.isEmpty( queryParams ) ) {
|
|
|
|
urlParser.search = '';
|
|
|
|
} else {
|
|
|
|
urlParser.search = $.param( queryParams );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-24 16:07:31 -04:00
|
|
|
parsedCandidateUrls.push( urlParser );
|
|
|
|
|
|
|
|
// Prepend list with URL that matches the scheme/protocol of the iframe.
|
|
|
|
if ( previewer.scheme.get() + ':' !== urlParser.protocol ) {
|
|
|
|
urlParser = document.createElement( 'a' );
|
|
|
|
urlParser.href = parsedCandidateUrls[0].href;
|
|
|
|
urlParser.protocol = previewer.scheme.get() + ':';
|
|
|
|
parsedCandidateUrls.unshift( urlParser );
|
|
|
|
}
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
|
2016-11-23 01:05:32 -05:00
|
|
|
// Attempt to match the URL to the control frame's scheme and check if it's allowed. If not, try the original URL.
|
2016-10-24 16:07:31 -04:00
|
|
|
parsedAllowedUrl = document.createElement( 'a' );
|
|
|
|
_.find( parsedCandidateUrls, function( parsedCandidateUrl ) {
|
|
|
|
return ! _.isUndefined( _.find( previewer.allowedUrls, function( allowedUrl ) {
|
|
|
|
parsedAllowedUrl.href = allowedUrl;
|
2016-10-25 16:53:29 -04:00
|
|
|
if ( urlParser.protocol === parsedAllowedUrl.protocol && urlParser.host === parsedAllowedUrl.host && 0 === urlParser.pathname.indexOf( parsedAllowedUrl.pathname.replace( /\/$/, '' ) ) ) {
|
2016-10-24 16:07:31 -04:00
|
|
|
result = parsedCandidateUrl.href;
|
|
|
|
return true;
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
2016-10-24 16:07:31 -04:00
|
|
|
} ) );
|
|
|
|
} );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2016-10-24 16:07:31 -04:00
|
|
|
return result;
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.bind( 'ready', previewer.ready );
|
|
|
|
|
|
|
|
// Start listening for keep-alive messages when iframe first loads.
|
|
|
|
previewer.deferred.active.done( _.bind( previewer.keepPreviewAlive, previewer ) );
|
|
|
|
|
|
|
|
previewer.bind( 'synced', function() {
|
|
|
|
previewer.send( 'active' );
|
|
|
|
} );
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Refresh the preview when the URL is changed (but not yet).
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.previewUrl.bind( previewer.refresh );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.scroll = 0;
|
|
|
|
previewer.bind( 'scroll', function( distance ) {
|
|
|
|
previewer.scroll = distance;
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
// Update the URL when the iframe sends a URL message, resetting scroll position. If URL is unchanged, then refresh.
|
|
|
|
previewer.bind( 'url', function( url ) {
|
|
|
|
var onUrlChange, urlChanged = false;
|
|
|
|
previewer.scroll = 0;
|
|
|
|
onUrlChange = function() {
|
|
|
|
urlChanged = true;
|
|
|
|
};
|
|
|
|
previewer.previewUrl.bind( onUrlChange );
|
|
|
|
previewer.previewUrl.set( url );
|
|
|
|
previewer.previewUrl.unbind( onUrlChange );
|
|
|
|
if ( ! urlChanged ) {
|
|
|
|
previewer.refresh();
|
|
|
|
}
|
|
|
|
} );
|
2014-11-11 17:29:23 -05:00
|
|
|
|
2014-12-03 21:04:22 -05:00
|
|
|
// Update the document title when the preview changes.
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.bind( 'documentTitle', function ( title ) {
|
2014-11-11 17:29:23 -05:00
|
|
|
api.setDocumentTitle( title );
|
|
|
|
} );
|
2012-08-22 20:04:18 -04:00
|
|
|
},
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
/**
|
|
|
|
* Handle the preview receiving the ready message.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
2016-11-23 01:05:32 -05:00
|
|
|
* @access public
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
*
|
|
|
|
* @param {object} data - Data from preview.
|
|
|
|
* @param {string} data.currentUrl - Current URL.
|
|
|
|
* @param {object} data.activePanels - Active panels.
|
|
|
|
* @param {object} data.activeSections Active sections.
|
|
|
|
* @param {object} data.activeControls Active controls.
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
ready: function( data ) {
|
|
|
|
var previewer = this, synced = {}, constructs;
|
|
|
|
|
|
|
|
synced.settings = api.get();
|
2016-11-03 01:07:32 -04:00
|
|
|
synced['settings-modified-while-loading'] = previewer.settingsModifiedWhileLoading;
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( 'resolved' !== previewer.deferred.active.state() || previewer.loading ) {
|
|
|
|
synced.scroll = previewer.scroll;
|
|
|
|
}
|
2016-10-26 16:03:32 -04:00
|
|
|
synced['edit-shortcut-visibility'] = api.state( 'editShortcutVisibility' ).get();
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.send( 'sync', synced );
|
|
|
|
|
|
|
|
// Set the previewUrl without causing the url to set the iframe.
|
|
|
|
if ( data.currentUrl ) {
|
|
|
|
previewer.previewUrl.unbind( previewer.refresh );
|
|
|
|
previewer.previewUrl.set( data.currentUrl );
|
|
|
|
previewer.previewUrl.bind( previewer.refresh );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Walk over all panels, sections, and controls and set their
|
|
|
|
* respective active states to true if the preview explicitly
|
|
|
|
* indicates as such.
|
|
|
|
*/
|
|
|
|
constructs = {
|
|
|
|
panel: data.activePanels,
|
|
|
|
section: data.activeSections,
|
|
|
|
control: data.activeControls
|
|
|
|
};
|
|
|
|
_( constructs ).each( function ( activeConstructs, type ) {
|
|
|
|
api[ type ].each( function ( construct, id ) {
|
|
|
|
var isDynamicallyCreated = _.isUndefined( api.settings[ type + 's' ][ id ] );
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If the construct was created statically in PHP (not dynamically in JS)
|
|
|
|
* then consider a missing (undefined) value in the activeConstructs to
|
|
|
|
* mean it should be deactivated (since it is gone). But if it is
|
|
|
|
* dynamically created then only toggle activation if the value is defined,
|
|
|
|
* as this means that the construct was also then correspondingly
|
|
|
|
* created statically in PHP and the active callback is available.
|
|
|
|
* Otherwise, dynamically-created constructs should normally have
|
|
|
|
* their active states toggled in JS rather than from PHP.
|
|
|
|
*/
|
|
|
|
if ( ! isDynamicallyCreated || ! _.isUndefined( activeConstructs[ id ] ) ) {
|
|
|
|
if ( activeConstructs[ id ] ) {
|
|
|
|
construct.activate();
|
|
|
|
} else {
|
|
|
|
construct.deactivate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
|
|
|
if ( data.settingValidities ) {
|
|
|
|
api._handleSettingValidities( {
|
|
|
|
settingValidities: data.settingValidities,
|
|
|
|
focusInvalidControl: false
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Keep the preview alive by listening for ready and keep-alive messages.
|
|
|
|
*
|
|
|
|
* If a message is not received in the allotted time then the iframe will be set back to the last known valid URL.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
2016-11-23 01:05:32 -05:00
|
|
|
* @access public
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
*
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
keepPreviewAlive: function keepPreviewAlive() {
|
|
|
|
var previewer = this, keepAliveTick, timeoutId, handleMissingKeepAlive, scheduleKeepAliveCheck;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Schedule a preview keep-alive check.
|
|
|
|
*
|
|
|
|
* Note that if a page load takes longer than keepAliveCheck milliseconds,
|
|
|
|
* the keep-alive messages will still be getting sent from the previous
|
|
|
|
* URL.
|
|
|
|
*/
|
|
|
|
scheduleKeepAliveCheck = function() {
|
|
|
|
timeoutId = setTimeout( handleMissingKeepAlive, api.settings.timeouts.keepAliveCheck );
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the previewerAlive state to true when receiving a message from the preview.
|
|
|
|
*/
|
|
|
|
keepAliveTick = function() {
|
|
|
|
api.state( 'previewerAlive' ).set( true );
|
|
|
|
clearTimeout( timeoutId );
|
|
|
|
scheduleKeepAliveCheck();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the previewerAlive state to false if keepAliveCheck milliseconds have transpired without a message.
|
|
|
|
*
|
|
|
|
* This is most likely to happen in the case of a connectivity error, or if the theme causes the browser
|
|
|
|
* to navigate to a non-allowed URL. Setting this state to false will force settings with a postMessage
|
|
|
|
* transport to use refresh instead, causing the preview frame also to be replaced with the current
|
|
|
|
* allowed preview URL.
|
|
|
|
*/
|
|
|
|
handleMissingKeepAlive = function() {
|
|
|
|
api.state( 'previewerAlive' ).set( false );
|
|
|
|
};
|
|
|
|
scheduleKeepAliveCheck();
|
|
|
|
|
|
|
|
previewer.bind( 'ready', keepAliveTick );
|
|
|
|
previewer.bind( 'keep-alive', keepAliveTick );
|
|
|
|
},
|
|
|
|
|
2015-09-05 15:53:24 -04:00
|
|
|
/**
|
|
|
|
* Query string data sent with each preview request.
|
|
|
|
*
|
|
|
|
* @abstract
|
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
query: function() {},
|
|
|
|
|
|
|
|
abort: function() {
|
|
|
|
if ( this.loading ) {
|
|
|
|
this.loading.destroy();
|
|
|
|
delete this.loading;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2015-09-05 15:53:24 -04:00
|
|
|
/**
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
* Refresh the preview seamlessly.
|
2016-11-23 01:05:32 -05:00
|
|
|
*
|
|
|
|
* @since 3.4.0
|
|
|
|
* @access public
|
|
|
|
* @returns {void}
|
2015-09-05 15:53:24 -04:00
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
refresh: function() {
|
2016-11-03 01:07:32 -04:00
|
|
|
var previewer = this, onSettingChange;
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-03-10 11:56:26 -04:00
|
|
|
// Display loading indicator
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.send( 'loading-initiated' );
|
2015-03-10 11:56:26 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.abort();
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.loading = new api.PreviewFrame({
|
|
|
|
url: previewer.url(),
|
|
|
|
previewUrl: previewer.previewUrl(),
|
|
|
|
query: previewer.query( { excludeCustomizedSaved: true } ) || {},
|
|
|
|
container: previewer.container
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
2016-11-03 01:07:32 -04:00
|
|
|
previewer.settingsModifiedWhileLoading = {};
|
|
|
|
onSettingChange = function( setting ) {
|
|
|
|
previewer.settingsModifiedWhileLoading[ setting.id ] = true;
|
|
|
|
};
|
|
|
|
api.bind( 'change', onSettingChange );
|
|
|
|
previewer.loading.always( function() {
|
|
|
|
api.unbind( 'change', onSettingChange );
|
|
|
|
} );
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.loading.done( function( readyData ) {
|
2016-11-10 17:43:32 -05:00
|
|
|
var loadingFrame = this, onceSynced;
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.preview = loadingFrame;
|
|
|
|
previewer.targetWindow( loadingFrame.targetWindow() );
|
|
|
|
previewer.channel( loadingFrame.channel() );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
onceSynced = function() {
|
|
|
|
loadingFrame.unbind( 'synced', onceSynced );
|
2016-11-10 17:43:32 -05:00
|
|
|
if ( previewer._previousPreview ) {
|
|
|
|
previewer._previousPreview.destroy();
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
}
|
2016-11-10 17:43:32 -05:00
|
|
|
previewer._previousPreview = previewer.preview;
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.deferred.active.resolve();
|
|
|
|
delete previewer.loading;
|
|
|
|
};
|
|
|
|
loadingFrame.bind( 'synced', onceSynced );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
// This event will be received directly by the previewer in normal navigation; this is only needed for seamless refresh.
|
|
|
|
previewer.trigger( 'ready', readyData );
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.loading.fail( function( reason ) {
|
|
|
|
previewer.send( 'loading-failed' );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
if ( 'logged out' === reason ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( previewer.preview ) {
|
|
|
|
previewer.preview.destroy();
|
|
|
|
delete previewer.preview;
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.login().done( previewer.refresh );
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
|
|
|
|
2015-03-10 11:56:26 -04:00
|
|
|
if ( 'cheatin' === reason ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.cheatin();
|
2015-03-10 11:56:26 -04:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
login: function() {
|
|
|
|
var previewer = this,
|
|
|
|
deferred, messenger, iframe;
|
|
|
|
|
|
|
|
if ( this._login )
|
|
|
|
return this._login;
|
|
|
|
|
|
|
|
deferred = $.Deferred();
|
|
|
|
this._login = deferred.promise();
|
|
|
|
|
|
|
|
messenger = new api.Messenger({
|
|
|
|
channel: 'login',
|
|
|
|
url: api.settings.url.login
|
|
|
|
});
|
|
|
|
|
2015-03-10 17:20:26 -04:00
|
|
|
iframe = $( '<iframe />', { 'src': api.settings.url.login, 'title': api.l10n.loginIframeTitle } ).appendTo( this.container );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
messenger.targetWindow( iframe[0].contentWindow );
|
|
|
|
|
2015-04-06 11:10:27 -04:00
|
|
|
messenger.bind( 'login', function () {
|
|
|
|
var refreshNonces = previewer.refreshNonces();
|
|
|
|
|
|
|
|
refreshNonces.always( function() {
|
|
|
|
iframe.remove();
|
|
|
|
messenger.destroy();
|
|
|
|
delete previewer._login;
|
|
|
|
});
|
|
|
|
|
|
|
|
refreshNonces.done( function() {
|
|
|
|
deferred.resolve();
|
|
|
|
});
|
|
|
|
|
|
|
|
refreshNonces.fail( function() {
|
|
|
|
previewer.cheatin();
|
|
|
|
deferred.reject();
|
|
|
|
});
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
return this._login;
|
|
|
|
},
|
|
|
|
|
|
|
|
cheatin: function() {
|
2015-09-03 23:40:25 -04:00
|
|
|
$( document.body ).empty().addClass( 'cheatin' ).append(
|
|
|
|
'<h1>' + api.l10n.cheatin + '</h1>' +
|
|
|
|
'<p>' + api.l10n.notAllowed + '</p>'
|
|
|
|
);
|
2015-04-06 11:10:27 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
refreshNonces: function() {
|
|
|
|
var request, deferred = $.Deferred();
|
|
|
|
|
|
|
|
deferred.promise();
|
|
|
|
|
|
|
|
request = wp.ajax.post( 'customize_refresh_nonces', {
|
|
|
|
wp_customize: 'on',
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
customize_theme: api.settings.theme.stylesheet
|
2015-04-06 11:10:27 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
request.done( function( response ) {
|
|
|
|
api.trigger( 'nonce-refresh', response );
|
|
|
|
deferred.resolve();
|
|
|
|
});
|
|
|
|
|
|
|
|
request.fail( function() {
|
|
|
|
deferred.reject();
|
|
|
|
});
|
|
|
|
|
|
|
|
return deferred;
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
Customize: Add setting validation model and control notifications to augment setting sanitization.
When a setting is invalid, not only will it be blocked from being saved but all other settings will be blocked as well. This ensures that Customizer saves aren't partial but are more transactional. User will be displayed the error in a notification so that they can fix and re-attempt saving.
PHP changes:
* Introduces `WP_Customize_Setting::validate()`, `WP_Customize_Setting::$validate_callback`, and the `customize_validate_{$setting_id}` filter.
* Introduces `WP_Customize_Manager::validate_setting_values()` to do validation (and sanitization) for the setting values supplied, returning a list of `WP_Error` instances for invalid settings.
* Attempting to save settings that are invalid will result in the save being blocked entirely, with the errors being sent in the `customize_save_response`. Modifies `WP_Customize_Manager::save()` to check all settings for validity issues prior to calling their `save` methods.
* Introduces `WP_Customize_Setting::json()` for parity with the other Customizer classes. This includes exporting of the `type`.
* Modifies `WP_Customize_Manager::post_value()` to apply `validate` after `sanitize`, and if validation fails, to return the `$default`.
* Introduces `customize_save_validation_before` action which fires right before the validation checks are made prior to saving.
JS changes:
* Introduces `wp.customize.Notification` in JS which to represent `WP_Error` instances returned from the server when setting validation fails.
* Introduces `wp.customize.Setting.prototype.notifications`.
* Introduces `wp.customize.Control.prototype.notifications`, which are synced with a control's settings' notifications.
* Introduces `wp.customize.Control.prototype.renderNotifications()` to re-render a control's notifications in its notification area. This is called automatically when the notifications collection changes.
* Introduces `wp.customize.settingConstructor`, allowing custom setting types to be used in the same way that custom controls, panels, and sections can be made.
* Injects a notification area into existing controls which is populated in response to the control's `notifications` collection changing. A custom control can customize the placement of the notification area by overriding the new `getNotificationsContainerElement` method.
* When a save fails due to setting invalidity, the invalidity errors will be added to the settings to then populate in the controls' notification areas, and the first such invalid control will be focused.
Props westonruter, celloexpressions, mrahmadawais.
See #35210.
See #30937.
Fixes #34893.
Built from https://develop.svn.wordpress.org/trunk@37476
git-svn-id: http://core.svn.wordpress.org/trunk@37444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-20 17:10:27 -04:00
|
|
|
api.settingConstructor = {};
|
2012-08-22 20:04:18 -04:00
|
|
|
api.controlConstructor = {
|
Customize: Improve custom background properties UI.
Introduces new control for managing the background position. Adds control for setting the `background-size`.
Props cdog, celloexpressions, grapplerulrich, MikeHansenMe, FolioVision, afercia, helen, melchoyce, karmatosed, westonruter, Kelderic, sebastian.pisula.
Fixes #22058.
Built from https://develop.svn.wordpress.org/trunk@38948
git-svn-id: http://core.svn.wordpress.org/trunk@38891 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-26 02:52:29 -04:00
|
|
|
color: api.ColorControl,
|
|
|
|
media: api.MediaControl,
|
|
|
|
upload: api.UploadControl,
|
|
|
|
image: api.ImageControl,
|
|
|
|
cropped_image: api.CroppedImageControl,
|
|
|
|
site_icon: api.SiteIconControl,
|
|
|
|
header: api.HeaderControl,
|
|
|
|
background: api.BackgroundControl,
|
|
|
|
background_position: api.BackgroundPositionControl,
|
|
|
|
theme: api.ThemeControl
|
2012-08-22 20:04:18 -04:00
|
|
|
};
|
2016-11-04 13:18:26 -04:00
|
|
|
api.panelConstructor = {};
|
2015-02-24 15:31:24 -05:00
|
|
|
api.sectionConstructor = {
|
|
|
|
themes: api.ThemesSection
|
|
|
|
};
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2016-06-26 10:26:29 -04:00
|
|
|
/**
|
|
|
|
* Handle setting_validities in an error response for the customize-save request.
|
|
|
|
*
|
|
|
|
* Add notifications to the settings and focus on the first control that has an invalid setting.
|
|
|
|
*
|
|
|
|
* @since 4.6.0
|
|
|
|
* @private
|
|
|
|
*
|
|
|
|
* @param {object} args
|
|
|
|
* @param {object} args.settingValidities
|
|
|
|
* @param {boolean} [args.focusInvalidControl=false]
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
api._handleSettingValidities = function handleSettingValidities( args ) {
|
|
|
|
var invalidSettingControls, invalidSettings = [], wasFocused = false;
|
|
|
|
|
|
|
|
// Find the controls that correspond to each invalid setting.
|
|
|
|
_.each( args.settingValidities, function( validity, settingId ) {
|
|
|
|
var setting = api( settingId );
|
|
|
|
if ( setting ) {
|
|
|
|
|
|
|
|
// Add notifications for invalidities.
|
|
|
|
if ( _.isObject( validity ) ) {
|
|
|
|
_.each( validity, function( params, code ) {
|
2016-09-02 18:35:44 -04:00
|
|
|
var notification, existingNotification, needsReplacement = false;
|
|
|
|
notification = new api.Notification( code, _.extend( { fromServer: true }, params ) );
|
2016-06-26 10:26:29 -04:00
|
|
|
|
|
|
|
// Remove existing notification if already exists for code but differs in parameters.
|
|
|
|
existingNotification = setting.notifications( notification.code );
|
|
|
|
if ( existingNotification ) {
|
2016-09-02 18:35:44 -04:00
|
|
|
needsReplacement = notification.type !== existingNotification.type || notification.message !== existingNotification.message || ! _.isEqual( notification.data, existingNotification.data );
|
2016-06-26 10:26:29 -04:00
|
|
|
}
|
|
|
|
if ( needsReplacement ) {
|
|
|
|
setting.notifications.remove( code );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ! setting.notifications.has( notification.code ) ) {
|
|
|
|
setting.notifications.add( code, notification );
|
|
|
|
}
|
|
|
|
invalidSettings.push( setting.id );
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove notification errors that are no longer valid.
|
|
|
|
setting.notifications.each( function( notification ) {
|
2017-03-23 14:12:44 -04:00
|
|
|
if ( notification.fromServer && 'error' === notification.type && ( true === validity || ! validity[ notification.code ] ) ) {
|
2016-06-26 10:26:29 -04:00
|
|
|
setting.notifications.remove( notification.code );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
if ( args.focusInvalidControl ) {
|
|
|
|
invalidSettingControls = api.findControlsForSettings( invalidSettings );
|
|
|
|
|
|
|
|
// Focus on the first control that is inside of an expanded section (one that is visible).
|
|
|
|
_( _.values( invalidSettingControls ) ).find( function( controls ) {
|
|
|
|
return _( controls ).find( function( control ) {
|
|
|
|
var isExpanded = control.section() && api.section.has( control.section() ) && api.section( control.section() ).expanded();
|
|
|
|
if ( isExpanded && control.expanded ) {
|
|
|
|
isExpanded = control.expanded();
|
|
|
|
}
|
|
|
|
if ( isExpanded ) {
|
|
|
|
control.focus();
|
|
|
|
wasFocused = true;
|
|
|
|
}
|
|
|
|
return wasFocused;
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Focus on the first invalid control.
|
|
|
|
if ( ! wasFocused && ! _.isEmpty( invalidSettingControls ) ) {
|
|
|
|
_.values( invalidSettingControls )[0][0].focus();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find all controls associated with the given settings.
|
|
|
|
*
|
|
|
|
* @since 4.6.0
|
|
|
|
* @param {string[]} settingIds Setting IDs.
|
|
|
|
* @returns {object<string, wp.customize.Control>} Mapping setting ids to arrays of controls.
|
|
|
|
*/
|
|
|
|
api.findControlsForSettings = function findControlsForSettings( settingIds ) {
|
|
|
|
var controls = {}, settingControls;
|
|
|
|
_.each( _.unique( settingIds ), function( settingId ) {
|
|
|
|
var setting = api( settingId );
|
|
|
|
if ( setting ) {
|
|
|
|
settingControls = setting.findControls();
|
|
|
|
if ( settingControls && settingControls.length > 0 ) {
|
|
|
|
controls[ settingId ] = settingControls;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
return controls;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sort panels, sections, controls by priorities. Hide empty sections and panels.
|
|
|
|
*
|
|
|
|
* @since 4.1.0
|
|
|
|
*/
|
|
|
|
api.reflowPaneContents = _.bind( function () {
|
|
|
|
|
2016-09-23 18:23:30 -04:00
|
|
|
var appendContainer, activeElement, rootHeadContainers, rootNodes = [], wasReflowed = false;
|
2016-06-26 10:26:29 -04:00
|
|
|
|
|
|
|
if ( document.activeElement ) {
|
|
|
|
activeElement = $( document.activeElement );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Sort the sections within each panel
|
|
|
|
api.panel.each( function ( panel ) {
|
|
|
|
var sections = panel.sections(),
|
2016-09-23 18:23:30 -04:00
|
|
|
sectionHeadContainers = _.pluck( sections, 'headContainer' );
|
2016-06-26 10:26:29 -04:00
|
|
|
rootNodes.push( panel );
|
2016-09-23 18:23:30 -04:00
|
|
|
appendContainer = ( panel.contentContainer.is( 'ul' ) ) ? panel.contentContainer : panel.contentContainer.find( 'ul:first' );
|
|
|
|
if ( ! api.utils.areElementListsEqual( sectionHeadContainers, appendContainer.children( '[id]' ) ) ) {
|
2016-06-26 10:26:29 -04:00
|
|
|
_( sections ).each( function ( section ) {
|
2016-09-23 18:23:30 -04:00
|
|
|
appendContainer.append( section.headContainer );
|
2016-06-26 10:26:29 -04:00
|
|
|
} );
|
|
|
|
wasReflowed = true;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Sort the controls within each section
|
|
|
|
api.section.each( function ( section ) {
|
|
|
|
var controls = section.controls(),
|
|
|
|
controlContainers = _.pluck( controls, 'container' );
|
|
|
|
if ( ! section.panel() ) {
|
|
|
|
rootNodes.push( section );
|
|
|
|
}
|
2016-09-23 18:23:30 -04:00
|
|
|
appendContainer = ( section.contentContainer.is( 'ul' ) ) ? section.contentContainer : section.contentContainer.find( 'ul:first' );
|
2016-06-26 10:26:29 -04:00
|
|
|
if ( ! api.utils.areElementListsEqual( controlContainers, appendContainer.children( '[id]' ) ) ) {
|
|
|
|
_( controls ).each( function ( control ) {
|
|
|
|
appendContainer.append( control.container );
|
|
|
|
} );
|
|
|
|
wasReflowed = true;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Sort the root panels and sections
|
|
|
|
rootNodes.sort( api.utils.prioritySort );
|
2016-09-23 18:23:30 -04:00
|
|
|
rootHeadContainers = _.pluck( rootNodes, 'headContainer' );
|
|
|
|
appendContainer = $( '#customize-theme-controls .customize-pane-parent' ); // @todo This should be defined elsewhere, and to be configurable
|
|
|
|
if ( ! api.utils.areElementListsEqual( rootHeadContainers, appendContainer.children() ) ) {
|
2016-06-26 10:26:29 -04:00
|
|
|
_( rootNodes ).each( function ( rootNode ) {
|
2016-09-23 18:23:30 -04:00
|
|
|
appendContainer.append( rootNode.headContainer );
|
2016-06-26 10:26:29 -04:00
|
|
|
} );
|
|
|
|
wasReflowed = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Now re-trigger the active Value callbacks to that the panels and sections can decide whether they can be rendered
|
|
|
|
api.panel.each( function ( panel ) {
|
|
|
|
var value = panel.active();
|
|
|
|
panel.active.callbacks.fireWith( panel.active, [ value, value ] );
|
|
|
|
} );
|
|
|
|
api.section.each( function ( section ) {
|
|
|
|
var value = section.active();
|
|
|
|
section.active.callbacks.fireWith( section.active, [ value, value ] );
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Restore focus if there was a reflow and there was an active (focused) element
|
|
|
|
if ( wasReflowed && activeElement ) {
|
|
|
|
activeElement.focus();
|
|
|
|
}
|
|
|
|
api.trigger( 'pane-contents-reflowed' );
|
|
|
|
}, api );
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
$( function() {
|
|
|
|
api.settings = window._wpCustomizeSettings;
|
|
|
|
api.l10n = window._wpCustomizeControlsL10n;
|
|
|
|
|
2014-10-15 13:21:19 -04:00
|
|
|
// Check if we can run the Customizer.
|
2014-12-02 17:56:45 -05:00
|
|
|
if ( ! api.settings ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
return;
|
2014-12-02 17:56:45 -05:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-07-29 14:36:26 -04:00
|
|
|
// Bail if any incompatibilities are found.
|
|
|
|
if ( ! $.support.postMessage || ( ! $.support.cors && api.settings.isCrossDomain ) ) {
|
|
|
|
return;
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( null === api.PreviewFrame.prototype.sensitivity ) {
|
|
|
|
api.PreviewFrame.prototype.sensitivity = api.settings.timeouts.previewFrameSensitivity;
|
|
|
|
}
|
|
|
|
if ( null === api.Previewer.prototype.refreshBuffer ) {
|
|
|
|
api.Previewer.prototype.refreshBuffer = api.settings.timeouts.windowRefresh;
|
|
|
|
}
|
|
|
|
|
2016-09-04 17:51:31 -04:00
|
|
|
var parent,
|
2013-11-15 01:08:10 -05:00
|
|
|
body = $( document.body ),
|
2014-07-08 13:04:15 -04:00
|
|
|
overlay = body.children( '.wp-full-overlay' ),
|
2015-05-29 09:57:26 -04:00
|
|
|
title = $( '#customize-info .panel-title.site-title' ),
|
2014-07-08 14:19:14 -04:00
|
|
|
closeBtn = $( '.customize-controls-close' ),
|
2016-02-15 20:57:26 -05:00
|
|
|
saveBtn = $( '#save' ),
|
|
|
|
footerActions = $( '#customize-footer-actions' );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-03-26 18:56:29 -04:00
|
|
|
// Prevent the form from saving when enter is pressed on an input or select element.
|
2012-08-22 20:04:18 -04:00
|
|
|
$('#customize-controls').on( 'keydown', function( e ) {
|
2014-03-26 18:56:29 -04:00
|
|
|
var isEnter = ( 13 === e.which ),
|
|
|
|
$el = $( e.target );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-03-26 18:56:29 -04:00
|
|
|
if ( isEnter && ( $el.is( 'input:not([type=button])' ) || $el.is( 'select' ) ) ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
e.preventDefault();
|
2014-03-26 18:56:29 -04:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
2014-12-03 21:04:22 -05:00
|
|
|
// Expand/Collapse the main customizer customize info.
|
2016-04-17 11:41:27 -04:00
|
|
|
$( '.customize-info' ).find( '> .accordion-section-title .customize-help-toggle' ).on( 'click', function() {
|
2015-05-29 09:57:26 -04:00
|
|
|
var section = $( this ).closest( '.accordion-section' ),
|
|
|
|
content = section.find( '.customize-panel-description:first' );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
|
|
|
|
if ( section.hasClass( 'cannot-expand' ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( section.hasClass( 'open' ) ) {
|
|
|
|
section.toggleClass( 'open' );
|
|
|
|
content.slideUp( api.Panel.prototype.defaultExpandedArguments.duration );
|
2015-05-29 09:57:26 -04:00
|
|
|
$( this ).attr( 'aria-expanded', false );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
} else {
|
|
|
|
content.slideDown( api.Panel.prototype.defaultExpandedArguments.duration );
|
|
|
|
section.toggleClass( 'open' );
|
2015-05-29 09:57:26 -04:00
|
|
|
$( this ).attr( 'aria-expanded', true );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Initialize Previewer
|
2014-07-09 16:58:15 -04:00
|
|
|
api.previewer = new api.Previewer({
|
2012-08-22 20:04:18 -04:00
|
|
|
container: '#customize-preview',
|
|
|
|
form: '#customize-controls',
|
|
|
|
previewUrl: api.settings.url.preview,
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
allowedUrls: api.settings.url.allowed
|
2012-08-22 20:04:18 -04:00
|
|
|
}, {
|
|
|
|
|
|
|
|
nonce: api.settings.nonce,
|
|
|
|
|
2015-09-05 15:53:24 -04:00
|
|
|
/**
|
|
|
|
* Build the query to send along with the Preview request.
|
|
|
|
*
|
2016-11-23 01:05:32 -05:00
|
|
|
* @since 3.4.0
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
* @since 4.7.0 Added options param.
|
2016-11-23 01:05:32 -05:00
|
|
|
* @access public
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
*
|
|
|
|
* @param {object} [options] Options.
|
|
|
|
* @param {boolean} [options.excludeCustomizedSaved=false] Exclude saved settings in customized response (values pending writing to changeset).
|
|
|
|
* @return {object} Query vars.
|
2015-09-05 15:53:24 -04:00
|
|
|
*/
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
query: function( options ) {
|
|
|
|
var queryVars = {
|
2012-08-22 20:04:18 -04:00
|
|
|
wp_customize: 'on',
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
customize_theme: api.settings.theme.stylesheet,
|
|
|
|
nonce: this.nonce.preview,
|
|
|
|
customize_changeset_uuid: api.settings.changeset.uuid
|
2012-08-22 20:04:18 -04:00
|
|
|
};
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Exclude customized data if requested especially for calls to requestChangesetUpdate.
|
|
|
|
* Changeset updates are differential and so it is a performance waste to send all of
|
|
|
|
* the dirty settings with each update.
|
|
|
|
*/
|
|
|
|
queryVars.customized = JSON.stringify( api.dirtyValues( {
|
|
|
|
unsaved: options && options.excludeCustomizedSaved
|
|
|
|
} ) );
|
|
|
|
|
|
|
|
return queryVars;
|
2012-08-22 20:04:18 -04:00
|
|
|
},
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
/**
|
|
|
|
* Save (and publish) the customizer changeset.
|
|
|
|
*
|
|
|
|
* Updates to the changeset are transactional. If any of the settings
|
|
|
|
* are invalid then none of them will be written into the changeset.
|
|
|
|
* A revision will be made for the changeset post if revisions support
|
|
|
|
* has been added to the post type.
|
|
|
|
*
|
2016-11-23 01:05:32 -05:00
|
|
|
* @since 3.4.0
|
|
|
|
* @since 4.7.0 Added args param and return value.
|
|
|
|
*
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
* @param {object} [args] Args.
|
|
|
|
* @param {string} [args.status=publish] Status.
|
|
|
|
* @param {string} [args.date] Date, in local time in MySQL format.
|
|
|
|
* @param {string} [args.title] Title
|
2016-11-23 01:05:32 -05:00
|
|
|
* @returns {jQuery.promise} Promise.
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
*/
|
|
|
|
save: function( args ) {
|
|
|
|
var previewer = this,
|
|
|
|
deferred = $.Deferred(),
|
|
|
|
changesetStatus = 'publish',
|
2014-03-14 15:16:14 -04:00
|
|
|
processing = api.state( 'processing' ),
|
|
|
|
submitWhenDoneProcessing,
|
2016-05-02 15:13:26 -04:00
|
|
|
submit,
|
2016-06-14 15:17:28 -04:00
|
|
|
modifiedWhileSaving = {},
|
|
|
|
invalidSettings = [],
|
|
|
|
invalidControls;
|
2014-03-14 15:16:14 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( args && args.status ) {
|
|
|
|
changesetStatus = args.status;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( api.state( 'saving' ).get() ) {
|
|
|
|
deferred.reject( 'already_saving' );
|
|
|
|
deferred.promise();
|
|
|
|
}
|
|
|
|
|
|
|
|
api.state( 'saving' ).set( true );
|
2014-03-14 15:16:14 -04:00
|
|
|
|
2016-05-02 15:13:26 -04:00
|
|
|
function captureSettingModifiedDuringSave( setting ) {
|
|
|
|
modifiedWhileSaving[ setting.id ] = true;
|
|
|
|
}
|
|
|
|
|
2014-03-14 15:16:14 -04:00
|
|
|
submit = function () {
|
Customize: Introduce starter content and site freshness state.
A theme can opt-in for tailored starter content to apply to the customizer when previewing the theme on a fresh install, when `fresh_site` is at its initial `1` value. Starter content is staged in the customizer and does not go live unless the changes are published. Initial starter content is added to Twenty Seventeen.
* The `fresh_site` flag is cleared when a published post or page is saved, when widgets are modified, or when the customizer state is saved.
* Starter content is registered via `starter-content` theme support, where the argument is an array containing `widgets`, `posts`, `nav_menus`, `options`, and `theme_mods`. Posts/pages in starter content are created with the `auto-draft` status, re-using the page/post stubs feature added to nav menus and the static front page controls.
* A `get_theme_starter_content` filter allows for plugins to extend a theme's starter content.
* Starter content in themes can/should re-use existing starter content items in core by using named placeholders.
* Import theme starter content into customized state when fresh site.
* Prevent original_title differences from causing refreshes if title is present.
* Ensure nav menu item url is set according to object when previewing.
* Make sure initial saved state is false if there are dirty settings without an existing changeset.
* Ensure dirty settings are cleaned upon changeset publishing.
Props helen, westonruter, ocean90.
Fixes #38114, #38533.
Built from https://develop.svn.wordpress.org/trunk@38991
git-svn-id: http://core.svn.wordpress.org/trunk@38934 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-27 22:57:35 -04:00
|
|
|
var request, query, settingInvalidities = {}, latestRevision = api._latestRevision;
|
2016-06-14 15:17:28 -04:00
|
|
|
|
2017-05-11 02:42:43 -04:00
|
|
|
api.bind( 'change', captureSettingModifiedDuringSave );
|
|
|
|
|
2016-06-14 15:17:28 -04:00
|
|
|
/*
|
|
|
|
* Block saving if there are any settings that are marked as
|
|
|
|
* invalid from the client (not from the server). Focus on
|
|
|
|
* the control.
|
|
|
|
*/
|
|
|
|
api.each( function( setting ) {
|
|
|
|
setting.notifications.each( function( notification ) {
|
2016-09-02 18:35:44 -04:00
|
|
|
if ( 'error' === notification.type && ! notification.fromServer ) {
|
2016-06-14 15:17:28 -04:00
|
|
|
invalidSettings.push( setting.id );
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( ! settingInvalidities[ setting.id ] ) {
|
|
|
|
settingInvalidities[ setting.id ] = {};
|
|
|
|
}
|
|
|
|
settingInvalidities[ setting.id ][ notification.code ] = notification;
|
2016-06-14 15:17:28 -04:00
|
|
|
}
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
invalidControls = api.findControlsForSettings( invalidSettings );
|
|
|
|
if ( ! _.isEmpty( invalidControls ) ) {
|
|
|
|
_.values( invalidControls )[0][0].focus();
|
|
|
|
api.unbind( 'change', captureSettingModifiedDuringSave );
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
deferred.rejectWith( previewer, [
|
|
|
|
{ setting_invalidities: settingInvalidities }
|
|
|
|
] );
|
|
|
|
api.state( 'saving' ).set( false );
|
|
|
|
return deferred.promise();
|
2016-06-14 15:17:28 -04:00
|
|
|
}
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
/*
|
|
|
|
* Note that excludeCustomizedSaved is intentionally false so that the entire
|
|
|
|
* set of customized data will be included if bypassed changeset update.
|
|
|
|
*/
|
|
|
|
query = $.extend( previewer.query( { excludeCustomizedSaved: false } ), {
|
|
|
|
nonce: previewer.nonce.save,
|
|
|
|
customize_changeset_status: changesetStatus
|
2015-03-10 18:45:27 -04:00
|
|
|
} );
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( args && args.date ) {
|
|
|
|
query.customize_changeset_date = args.date;
|
|
|
|
}
|
|
|
|
if ( args && args.title ) {
|
|
|
|
query.customize_changeset_title = args.title;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Note that the dirty customized values will have already been set in the
|
|
|
|
* changeset and so technically query.customized could be deleted. However,
|
|
|
|
* it is remaining here to make sure that any settings that got updated
|
|
|
|
* quietly which may have not triggered an update request will also get
|
|
|
|
* included in the values that get saved to the changeset. This will ensure
|
|
|
|
* that values that get injected via the saved event will be included in
|
|
|
|
* the changeset. This also ensures that setting values that were invalid
|
|
|
|
* will get re-validated, perhaps in the case of settings that are invalid
|
|
|
|
* due to dependencies on other settings.
|
|
|
|
*/
|
2015-03-10 18:45:27 -04:00
|
|
|
request = wp.ajax.post( 'customize_save', query );
|
2014-03-14 15:16:14 -04:00
|
|
|
|
2016-05-02 15:13:26 -04:00
|
|
|
// Disable save button during the save request.
|
|
|
|
saveBtn.prop( 'disabled', true );
|
|
|
|
|
2014-03-14 15:16:14 -04:00
|
|
|
api.trigger( 'save', request );
|
|
|
|
|
|
|
|
request.always( function () {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
api.state( 'saving' ).set( false );
|
2016-05-02 15:13:26 -04:00
|
|
|
saveBtn.prop( 'disabled', false );
|
|
|
|
api.unbind( 'change', captureSettingModifiedDuringSave );
|
2014-03-14 15:16:14 -04:00
|
|
|
} );
|
|
|
|
|
2015-01-06 16:47:23 -05:00
|
|
|
request.fail( function ( response ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
|
2014-03-14 15:16:14 -04:00
|
|
|
if ( '0' === response ) {
|
2015-01-06 16:47:23 -05:00
|
|
|
response = 'not_logged_in';
|
|
|
|
} else if ( '-1' === response ) {
|
|
|
|
// Back-compat in case any other check_ajax_referer() call is dying
|
|
|
|
response = 'invalid_nonce';
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( 'invalid_nonce' === response ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.cheatin();
|
2015-01-06 16:47:23 -05:00
|
|
|
} else if ( 'not_logged_in' === response ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.preview.iframe.hide();
|
|
|
|
previewer.login().done( function() {
|
|
|
|
previewer.save();
|
|
|
|
previewer.preview.iframe.show();
|
2014-03-14 15:16:14 -04:00
|
|
|
} );
|
|
|
|
}
|
Customize: Add setting validation model and control notifications to augment setting sanitization.
When a setting is invalid, not only will it be blocked from being saved but all other settings will be blocked as well. This ensures that Customizer saves aren't partial but are more transactional. User will be displayed the error in a notification so that they can fix and re-attempt saving.
PHP changes:
* Introduces `WP_Customize_Setting::validate()`, `WP_Customize_Setting::$validate_callback`, and the `customize_validate_{$setting_id}` filter.
* Introduces `WP_Customize_Manager::validate_setting_values()` to do validation (and sanitization) for the setting values supplied, returning a list of `WP_Error` instances for invalid settings.
* Attempting to save settings that are invalid will result in the save being blocked entirely, with the errors being sent in the `customize_save_response`. Modifies `WP_Customize_Manager::save()` to check all settings for validity issues prior to calling their `save` methods.
* Introduces `WP_Customize_Setting::json()` for parity with the other Customizer classes. This includes exporting of the `type`.
* Modifies `WP_Customize_Manager::post_value()` to apply `validate` after `sanitize`, and if validation fails, to return the `$default`.
* Introduces `customize_save_validation_before` action which fires right before the validation checks are made prior to saving.
JS changes:
* Introduces `wp.customize.Notification` in JS which to represent `WP_Error` instances returned from the server when setting validation fails.
* Introduces `wp.customize.Setting.prototype.notifications`.
* Introduces `wp.customize.Control.prototype.notifications`, which are synced with a control's settings' notifications.
* Introduces `wp.customize.Control.prototype.renderNotifications()` to re-render a control's notifications in its notification area. This is called automatically when the notifications collection changes.
* Introduces `wp.customize.settingConstructor`, allowing custom setting types to be used in the same way that custom controls, panels, and sections can be made.
* Injects a notification area into existing controls which is populated in response to the control's `notifications` collection changing. A custom control can customize the placement of the notification area by overriding the new `getNotificationsContainerElement` method.
* When a save fails due to setting invalidity, the invalidity errors will be added to the settings to then populate in the controls' notification areas, and the first such invalid control will be focused.
Props westonruter, celloexpressions, mrahmadawais.
See #35210.
See #30937.
Fixes #34893.
Built from https://develop.svn.wordpress.org/trunk@37476
git-svn-id: http://core.svn.wordpress.org/trunk@37444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-20 17:10:27 -04:00
|
|
|
|
2016-06-14 15:17:28 -04:00
|
|
|
if ( response.setting_validities ) {
|
|
|
|
api._handleSettingValidities( {
|
|
|
|
settingValidities: response.setting_validities,
|
|
|
|
focusInvalidControl: true
|
|
|
|
} );
|
|
|
|
}
|
Customize: Add setting validation model and control notifications to augment setting sanitization.
When a setting is invalid, not only will it be blocked from being saved but all other settings will be blocked as well. This ensures that Customizer saves aren't partial but are more transactional. User will be displayed the error in a notification so that they can fix and re-attempt saving.
PHP changes:
* Introduces `WP_Customize_Setting::validate()`, `WP_Customize_Setting::$validate_callback`, and the `customize_validate_{$setting_id}` filter.
* Introduces `WP_Customize_Manager::validate_setting_values()` to do validation (and sanitization) for the setting values supplied, returning a list of `WP_Error` instances for invalid settings.
* Attempting to save settings that are invalid will result in the save being blocked entirely, with the errors being sent in the `customize_save_response`. Modifies `WP_Customize_Manager::save()` to check all settings for validity issues prior to calling their `save` methods.
* Introduces `WP_Customize_Setting::json()` for parity with the other Customizer classes. This includes exporting of the `type`.
* Modifies `WP_Customize_Manager::post_value()` to apply `validate` after `sanitize`, and if validation fails, to return the `$default`.
* Introduces `customize_save_validation_before` action which fires right before the validation checks are made prior to saving.
JS changes:
* Introduces `wp.customize.Notification` in JS which to represent `WP_Error` instances returned from the server when setting validation fails.
* Introduces `wp.customize.Setting.prototype.notifications`.
* Introduces `wp.customize.Control.prototype.notifications`, which are synced with a control's settings' notifications.
* Introduces `wp.customize.Control.prototype.renderNotifications()` to re-render a control's notifications in its notification area. This is called automatically when the notifications collection changes.
* Introduces `wp.customize.settingConstructor`, allowing custom setting types to be used in the same way that custom controls, panels, and sections can be made.
* Injects a notification area into existing controls which is populated in response to the control's `notifications` collection changing. A custom control can customize the placement of the notification area by overriding the new `getNotificationsContainerElement` method.
* When a save fails due to setting invalidity, the invalidity errors will be added to the settings to then populate in the controls' notification areas, and the first such invalid control will be focused.
Props westonruter, celloexpressions, mrahmadawais.
See #35210.
See #30937.
Fixes #34893.
Built from https://develop.svn.wordpress.org/trunk@37476
git-svn-id: http://core.svn.wordpress.org/trunk@37444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-20 17:10:27 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
deferred.rejectWith( previewer, [ response ] );
|
2015-01-06 16:47:23 -05:00
|
|
|
api.trigger( 'error', response );
|
|
|
|
} );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-01-06 16:47:23 -05:00
|
|
|
request.done( function( response ) {
|
2016-05-02 15:13:26 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewer.send( 'saved', response );
|
2015-01-06 16:47:23 -05:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
api.state( 'changesetStatus' ).set( response.changeset_status );
|
|
|
|
if ( 'publish' === response.changeset_status ) {
|
Customize: Introduce starter content and site freshness state.
A theme can opt-in for tailored starter content to apply to the customizer when previewing the theme on a fresh install, when `fresh_site` is at its initial `1` value. Starter content is staged in the customizer and does not go live unless the changes are published. Initial starter content is added to Twenty Seventeen.
* The `fresh_site` flag is cleared when a published post or page is saved, when widgets are modified, or when the customizer state is saved.
* Starter content is registered via `starter-content` theme support, where the argument is an array containing `widgets`, `posts`, `nav_menus`, `options`, and `theme_mods`. Posts/pages in starter content are created with the `auto-draft` status, re-using the page/post stubs feature added to nav menus and the static front page controls.
* A `get_theme_starter_content` filter allows for plugins to extend a theme's starter content.
* Starter content in themes can/should re-use existing starter content items in core by using named placeholders.
* Import theme starter content into customized state when fresh site.
* Prevent original_title differences from causing refreshes if title is present.
* Ensure nav menu item url is set according to object when previewing.
* Make sure initial saved state is false if there are dirty settings without an existing changeset.
* Ensure dirty settings are cleaned upon changeset publishing.
Props helen, westonruter, ocean90.
Fixes #38114, #38533.
Built from https://develop.svn.wordpress.org/trunk@38991
git-svn-id: http://core.svn.wordpress.org/trunk@38934 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-27 22:57:35 -04:00
|
|
|
|
|
|
|
// Mark all published as clean if they haven't been modified during the request.
|
|
|
|
api.each( function( setting ) {
|
|
|
|
/*
|
|
|
|
* Note that the setting revision will be undefined in the case of setting
|
|
|
|
* values that are marked as dirty when the customizer is loaded, such as
|
|
|
|
* when applying starter content. All other dirty settings will have an
|
|
|
|
* associated revision due to their modification triggering a change event.
|
|
|
|
*/
|
|
|
|
if ( setting._dirty && ( _.isUndefined( api._latestSettingRevisions[ setting.id ] ) || api._latestSettingRevisions[ setting.id ] <= latestRevision ) ) {
|
|
|
|
setting._dirty = false;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
api.state( 'changesetStatus' ).set( '' );
|
|
|
|
api.settings.changeset.uuid = response.next_changeset_uuid;
|
|
|
|
parent.send( 'changeset-uuid', api.settings.changeset.uuid );
|
|
|
|
}
|
2016-01-26 18:52:25 -05:00
|
|
|
|
2016-06-14 15:17:28 -04:00
|
|
|
if ( response.setting_validities ) {
|
|
|
|
api._handleSettingValidities( {
|
|
|
|
settingValidities: response.setting_validities,
|
|
|
|
focusInvalidControl: true
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
deferred.resolveWith( previewer, [ response ] );
|
2015-01-06 16:47:23 -05:00
|
|
|
api.trigger( 'saved', response );
|
2016-05-02 15:13:26 -04:00
|
|
|
|
|
|
|
// Restore the global dirty state if any settings were modified during save.
|
|
|
|
if ( ! _.isEmpty( modifiedWhileSaving ) ) {
|
|
|
|
api.state( 'saved' ).set( false );
|
|
|
|
}
|
2014-03-14 15:16:14 -04:00
|
|
|
} );
|
|
|
|
};
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-03-14 15:16:14 -04:00
|
|
|
if ( 0 === processing() ) {
|
|
|
|
submit();
|
|
|
|
} else {
|
|
|
|
submitWhenDoneProcessing = function () {
|
|
|
|
if ( 0 === processing() ) {
|
|
|
|
api.state.unbind( 'change', submitWhenDoneProcessing );
|
|
|
|
submit();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
api.state.bind( 'change', submitWhenDoneProcessing );
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
return deferred.promise();
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2017-05-16 08:07:43 -04:00
|
|
|
// Ensure preview nonce is included with every customized request, to allow post data to be read.
|
|
|
|
$.ajaxPrefilter( function injectPreviewNonce( options ) {
|
|
|
|
if ( ! /wp_customize=on/.test( options.data ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
options.data += '&' + $.param({
|
|
|
|
customize_preview_nonce: api.settings.nonce.preview
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Refresh the nonces if the preview sends updated nonces over.
|
2014-07-09 16:58:15 -04:00
|
|
|
api.previewer.bind( 'nonce', function( nonce ) {
|
2013-11-15 01:08:10 -05:00
|
|
|
$.extend( this.nonce, nonce );
|
|
|
|
});
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-04-06 11:10:27 -04:00
|
|
|
// Refresh the nonces if login sends updated nonces over.
|
|
|
|
api.bind( 'nonce-refresh', function( nonce ) {
|
|
|
|
$.extend( api.settings.nonce, nonce );
|
|
|
|
$.extend( api.previewer.nonce, nonce );
|
2016-01-27 12:55:26 -05:00
|
|
|
api.previewer.send( 'nonce-refresh', nonce );
|
2015-04-06 11:10:27 -04:00
|
|
|
});
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
// Create Settings
|
2012-08-22 20:04:18 -04:00
|
|
|
$.each( api.settings.settings, function( id, data ) {
|
Customize: Add setting validation model and control notifications to augment setting sanitization.
When a setting is invalid, not only will it be blocked from being saved but all other settings will be blocked as well. This ensures that Customizer saves aren't partial but are more transactional. User will be displayed the error in a notification so that they can fix and re-attempt saving.
PHP changes:
* Introduces `WP_Customize_Setting::validate()`, `WP_Customize_Setting::$validate_callback`, and the `customize_validate_{$setting_id}` filter.
* Introduces `WP_Customize_Manager::validate_setting_values()` to do validation (and sanitization) for the setting values supplied, returning a list of `WP_Error` instances for invalid settings.
* Attempting to save settings that are invalid will result in the save being blocked entirely, with the errors being sent in the `customize_save_response`. Modifies `WP_Customize_Manager::save()` to check all settings for validity issues prior to calling their `save` methods.
* Introduces `WP_Customize_Setting::json()` for parity with the other Customizer classes. This includes exporting of the `type`.
* Modifies `WP_Customize_Manager::post_value()` to apply `validate` after `sanitize`, and if validation fails, to return the `$default`.
* Introduces `customize_save_validation_before` action which fires right before the validation checks are made prior to saving.
JS changes:
* Introduces `wp.customize.Notification` in JS which to represent `WP_Error` instances returned from the server when setting validation fails.
* Introduces `wp.customize.Setting.prototype.notifications`.
* Introduces `wp.customize.Control.prototype.notifications`, which are synced with a control's settings' notifications.
* Introduces `wp.customize.Control.prototype.renderNotifications()` to re-render a control's notifications in its notification area. This is called automatically when the notifications collection changes.
* Introduces `wp.customize.settingConstructor`, allowing custom setting types to be used in the same way that custom controls, panels, and sections can be made.
* Injects a notification area into existing controls which is populated in response to the control's `notifications` collection changing. A custom control can customize the placement of the notification area by overriding the new `getNotificationsContainerElement` method.
* When a save fails due to setting invalidity, the invalidity errors will be added to the settings to then populate in the controls' notification areas, and the first such invalid control will be focused.
Props westonruter, celloexpressions, mrahmadawais.
See #35210.
See #30937.
Fixes #34893.
Built from https://develop.svn.wordpress.org/trunk@37476
git-svn-id: http://core.svn.wordpress.org/trunk@37444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-20 17:10:27 -04:00
|
|
|
var constructor = api.settingConstructor[ data.type ] || api.Setting,
|
|
|
|
setting;
|
|
|
|
|
|
|
|
setting = new constructor( id, data.value, {
|
2012-08-22 20:04:18 -04:00
|
|
|
transport: data.transport,
|
2015-03-10 18:39:28 -04:00
|
|
|
previewer: api.previewer,
|
|
|
|
dirty: !! data.dirty
|
2012-08-22 20:04:18 -04:00
|
|
|
} );
|
Customize: Add setting validation model and control notifications to augment setting sanitization.
When a setting is invalid, not only will it be blocked from being saved but all other settings will be blocked as well. This ensures that Customizer saves aren't partial but are more transactional. User will be displayed the error in a notification so that they can fix and re-attempt saving.
PHP changes:
* Introduces `WP_Customize_Setting::validate()`, `WP_Customize_Setting::$validate_callback`, and the `customize_validate_{$setting_id}` filter.
* Introduces `WP_Customize_Manager::validate_setting_values()` to do validation (and sanitization) for the setting values supplied, returning a list of `WP_Error` instances for invalid settings.
* Attempting to save settings that are invalid will result in the save being blocked entirely, with the errors being sent in the `customize_save_response`. Modifies `WP_Customize_Manager::save()` to check all settings for validity issues prior to calling their `save` methods.
* Introduces `WP_Customize_Setting::json()` for parity with the other Customizer classes. This includes exporting of the `type`.
* Modifies `WP_Customize_Manager::post_value()` to apply `validate` after `sanitize`, and if validation fails, to return the `$default`.
* Introduces `customize_save_validation_before` action which fires right before the validation checks are made prior to saving.
JS changes:
* Introduces `wp.customize.Notification` in JS which to represent `WP_Error` instances returned from the server when setting validation fails.
* Introduces `wp.customize.Setting.prototype.notifications`.
* Introduces `wp.customize.Control.prototype.notifications`, which are synced with a control's settings' notifications.
* Introduces `wp.customize.Control.prototype.renderNotifications()` to re-render a control's notifications in its notification area. This is called automatically when the notifications collection changes.
* Introduces `wp.customize.settingConstructor`, allowing custom setting types to be used in the same way that custom controls, panels, and sections can be made.
* Injects a notification area into existing controls which is populated in response to the control's `notifications` collection changing. A custom control can customize the placement of the notification area by overriding the new `getNotificationsContainerElement` method.
* When a save fails due to setting invalidity, the invalidity errors will be added to the settings to then populate in the controls' notification areas, and the first such invalid control will be focused.
Props westonruter, celloexpressions, mrahmadawais.
See #35210.
See #30937.
Fixes #34893.
Built from https://develop.svn.wordpress.org/trunk@37476
git-svn-id: http://core.svn.wordpress.org/trunk@37444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-05-20 17:10:27 -04:00
|
|
|
api.add( id, setting );
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
// Create Panels
|
|
|
|
$.each( api.settings.panels, function ( id, data ) {
|
|
|
|
var constructor = api.panelConstructor[ data.type ] || api.Panel,
|
|
|
|
panel;
|
|
|
|
|
|
|
|
panel = new constructor( id, {
|
|
|
|
params: data
|
|
|
|
} );
|
|
|
|
api.panel.add( id, panel );
|
|
|
|
});
|
|
|
|
|
|
|
|
// Create Sections
|
|
|
|
$.each( api.settings.sections, function ( id, data ) {
|
|
|
|
var constructor = api.sectionConstructor[ data.type ] || api.Section,
|
|
|
|
section;
|
|
|
|
|
|
|
|
section = new constructor( id, {
|
|
|
|
params: data
|
|
|
|
} );
|
|
|
|
api.section.add( id, section );
|
|
|
|
});
|
|
|
|
|
|
|
|
// Create Controls
|
2012-08-22 20:04:18 -04:00
|
|
|
$.each( api.settings.controls, function( id, data ) {
|
|
|
|
var constructor = api.controlConstructor[ data.type ] || api.Control,
|
|
|
|
control;
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
control = new constructor( id, {
|
2012-08-22 20:04:18 -04:00
|
|
|
params: data,
|
2014-07-09 16:58:15 -04:00
|
|
|
previewer: api.previewer
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
} );
|
|
|
|
api.control.add( id, control );
|
|
|
|
});
|
|
|
|
|
|
|
|
// Focus the autofocused element
|
2016-03-01 17:04:27 -05:00
|
|
|
_.each( [ 'panel', 'section', 'control' ], function( type ) {
|
|
|
|
var id = api.settings.autofocus[ type ];
|
|
|
|
if ( ! id ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Defer focus until:
|
|
|
|
* 1. The panel, section, or control exists (especially for dynamically-created ones).
|
|
|
|
* 2. The instance is embedded in the document (and so is focusable).
|
|
|
|
* 3. The preview has finished loading so that the active states have been set.
|
|
|
|
*/
|
|
|
|
api[ type ]( id, function( instance ) {
|
|
|
|
instance.deferred.embedded.done( function() {
|
|
|
|
api.previewer.deferred.active.done( function() {
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
instance.focus();
|
|
|
|
});
|
|
|
|
});
|
2016-03-01 17:04:27 -05:00
|
|
|
});
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
api.bind( 'ready', api.reflowPaneContents );
|
|
|
|
$( [ api.panel, api.section, api.control ] ).each( function ( i, values ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
var debouncedReflowPaneContents = _.debounce( api.reflowPaneContents, api.settings.timeouts.reflowPaneContents );
|
2016-06-26 10:26:29 -04:00
|
|
|
values.bind( 'add', debouncedReflowPaneContents );
|
|
|
|
values.bind( 'change', debouncedReflowPaneContents );
|
|
|
|
values.bind( 'remove', debouncedReflowPaneContents );
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
} );
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Save and activated states
|
|
|
|
(function() {
|
|
|
|
var state = new api.Values(),
|
2014-03-14 15:16:14 -04:00
|
|
|
saved = state.create( 'saved' ),
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
saving = state.create( 'saving' ),
|
2014-03-14 15:16:14 -04:00
|
|
|
activated = state.create( 'activated' ),
|
2016-09-01 01:55:27 -04:00
|
|
|
processing = state.create( 'processing' ),
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
paneVisible = state.create( 'paneVisible' ),
|
2016-10-21 02:37:30 -04:00
|
|
|
expandedPanel = state.create( 'expandedPanel' ),
|
|
|
|
expandedSection = state.create( 'expandedSection' ),
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
changesetStatus = state.create( 'changesetStatus' ),
|
|
|
|
previewerAlive = state.create( 'previewerAlive' ),
|
2016-10-26 16:03:32 -04:00
|
|
|
editShortcutVisibility = state.create( 'editShortcutVisibility' ),
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
populateChangesetUuidParam;
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
state.bind( 'change', function() {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
var canSave;
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
if ( ! activated() ) {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
saveBtn.val( api.l10n.activate );
|
2014-07-08 14:19:14 -04:00
|
|
|
closeBtn.find( '.screen-reader-text' ).text( api.l10n.cancel );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
} else if ( '' === changesetStatus.get() && saved() ) {
|
|
|
|
saveBtn.val( api.l10n.saved );
|
2014-07-08 14:19:14 -04:00
|
|
|
closeBtn.find( '.screen-reader-text' ).text( api.l10n.close );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
} else {
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
saveBtn.val( api.l10n.save );
|
2014-07-08 14:19:14 -04:00
|
|
|
closeBtn.find( '.screen-reader-text' ).text( api.l10n.cancel );
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Save (publish) button should be enabled if saving is not currently happening,
|
|
|
|
* and if the theme is not active or the changeset exists but is not published.
|
|
|
|
*/
|
|
|
|
canSave = ! saving() && ( ! activated() || ! saved() || ( '' !== changesetStatus() && 'publish' !== changesetStatus() ) );
|
|
|
|
|
|
|
|
saveBtn.prop( 'disabled', ! canSave );
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
// Set default states.
|
Customize: Introduce starter content and site freshness state.
A theme can opt-in for tailored starter content to apply to the customizer when previewing the theme on a fresh install, when `fresh_site` is at its initial `1` value. Starter content is staged in the customizer and does not go live unless the changes are published. Initial starter content is added to Twenty Seventeen.
* The `fresh_site` flag is cleared when a published post or page is saved, when widgets are modified, or when the customizer state is saved.
* Starter content is registered via `starter-content` theme support, where the argument is an array containing `widgets`, `posts`, `nav_menus`, `options`, and `theme_mods`. Posts/pages in starter content are created with the `auto-draft` status, re-using the page/post stubs feature added to nav menus and the static front page controls.
* A `get_theme_starter_content` filter allows for plugins to extend a theme's starter content.
* Starter content in themes can/should re-use existing starter content items in core by using named placeholders.
* Import theme starter content into customized state when fresh site.
* Prevent original_title differences from causing refreshes if title is present.
* Ensure nav menu item url is set according to object when previewing.
* Make sure initial saved state is false if there are dirty settings without an existing changeset.
* Ensure dirty settings are cleaned upon changeset publishing.
Props helen, westonruter, ocean90.
Fixes #38114, #38533.
Built from https://develop.svn.wordpress.org/trunk@38991
git-svn-id: http://core.svn.wordpress.org/trunk@38934 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-27 22:57:35 -04:00
|
|
|
changesetStatus( api.settings.changeset.status );
|
2012-08-22 20:04:18 -04:00
|
|
|
saved( true );
|
Customize: Introduce starter content and site freshness state.
A theme can opt-in for tailored starter content to apply to the customizer when previewing the theme on a fresh install, when `fresh_site` is at its initial `1` value. Starter content is staged in the customizer and does not go live unless the changes are published. Initial starter content is added to Twenty Seventeen.
* The `fresh_site` flag is cleared when a published post or page is saved, when widgets are modified, or when the customizer state is saved.
* Starter content is registered via `starter-content` theme support, where the argument is an array containing `widgets`, `posts`, `nav_menus`, `options`, and `theme_mods`. Posts/pages in starter content are created with the `auto-draft` status, re-using the page/post stubs feature added to nav menus and the static front page controls.
* A `get_theme_starter_content` filter allows for plugins to extend a theme's starter content.
* Starter content in themes can/should re-use existing starter content items in core by using named placeholders.
* Import theme starter content into customized state when fresh site.
* Prevent original_title differences from causing refreshes if title is present.
* Ensure nav menu item url is set according to object when previewing.
* Make sure initial saved state is false if there are dirty settings without an existing changeset.
* Ensure dirty settings are cleaned upon changeset publishing.
Props helen, westonruter, ocean90.
Fixes #38114, #38533.
Built from https://develop.svn.wordpress.org/trunk@38991
git-svn-id: http://core.svn.wordpress.org/trunk@38934 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-27 22:57:35 -04:00
|
|
|
if ( '' === changesetStatus() ) { // Handle case for loading starter content.
|
|
|
|
api.each( function( setting ) {
|
|
|
|
if ( setting._dirty ) {
|
|
|
|
saved( false );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
}
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
saving( false );
|
2012-08-22 20:04:18 -04:00
|
|
|
activated( api.settings.theme.active );
|
2014-03-14 15:16:14 -04:00
|
|
|
processing( 0 );
|
2016-09-01 01:55:27 -04:00
|
|
|
paneVisible( true );
|
2016-10-21 02:37:30 -04:00
|
|
|
expandedPanel( false );
|
|
|
|
expandedSection( false );
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
previewerAlive( true );
|
2016-11-04 13:13:57 -04:00
|
|
|
editShortcutVisibility( 'visible' );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
api.bind( 'change', function() {
|
2017-01-05 00:18:43 -05:00
|
|
|
if ( state( 'saved' ).get() ) {
|
|
|
|
state( 'saved' ).set( false );
|
|
|
|
populateChangesetUuidParam( true );
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
saving.bind( function( isSaving ) {
|
|
|
|
body.toggleClass( 'saving', isSaving );
|
|
|
|
} );
|
|
|
|
|
|
|
|
api.bind( 'saved', function( response ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
state('saved').set( true );
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
if ( 'publish' === response.changeset_status ) {
|
|
|
|
state( 'activated' ).set( true );
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
activated.bind( function( to ) {
|
2016-06-26 10:26:29 -04:00
|
|
|
if ( to ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
api.trigger( 'activated' );
|
2016-06-26 10:26:29 -04:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
2016-11-23 01:05:32 -05:00
|
|
|
/**
|
|
|
|
* Populate URL with UUID via `history.replaceState()`.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
|
|
|
* @access private
|
|
|
|
*
|
|
|
|
* @param {boolean} isIncluded Is UUID included.
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
populateChangesetUuidParam = function( isIncluded ) {
|
|
|
|
var urlParser, queryParams;
|
2017-04-10 17:15:41 -04:00
|
|
|
|
|
|
|
// Abort on IE9 which doesn't support history management.
|
|
|
|
if ( ! history.replaceState ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
urlParser = document.createElement( 'a' );
|
|
|
|
urlParser.href = location.href;
|
|
|
|
queryParams = api.utils.parseQueryString( urlParser.search.substr( 1 ) );
|
|
|
|
if ( isIncluded ) {
|
|
|
|
if ( queryParams.changeset_uuid === api.settings.changeset.uuid ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
queryParams.changeset_uuid = api.settings.changeset.uuid;
|
|
|
|
} else {
|
|
|
|
if ( ! queryParams.changeset_uuid ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
delete queryParams.changeset_uuid;
|
|
|
|
}
|
|
|
|
urlParser.search = $.param( queryParams );
|
|
|
|
history.replaceState( {}, document.title, urlParser.href );
|
|
|
|
};
|
|
|
|
|
2017-04-10 17:15:41 -04:00
|
|
|
changesetStatus.bind( function( newStatus ) {
|
|
|
|
populateChangesetUuidParam( '' !== newStatus && 'publish' !== newStatus );
|
|
|
|
} );
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Expose states to the API.
|
|
|
|
api.state = state;
|
|
|
|
}());
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
// Check if preview url is valid and load the preview frame.
|
|
|
|
if ( api.previewer.previewUrl() ) {
|
|
|
|
api.previewer.refresh();
|
|
|
|
} else {
|
|
|
|
api.previewer.previewUrl( api.settings.url.home );
|
|
|
|
}
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Button bindings.
|
2014-07-08 13:04:15 -04:00
|
|
|
saveBtn.click( function( event ) {
|
2014-07-09 16:58:15 -04:00
|
|
|
api.previewer.save();
|
2012-08-22 20:04:18 -04:00
|
|
|
event.preventDefault();
|
2012-11-06 09:47:25 -05:00
|
|
|
}).keydown( function( event ) {
|
|
|
|
if ( 9 === event.which ) // tab
|
|
|
|
return;
|
|
|
|
if ( 13 === event.which ) // enter
|
2014-07-09 16:58:15 -04:00
|
|
|
api.previewer.save();
|
2012-11-06 09:47:25 -05:00
|
|
|
event.preventDefault();
|
|
|
|
});
|
2012-11-09 00:44:00 -05:00
|
|
|
|
2014-07-08 14:19:14 -04:00
|
|
|
closeBtn.keydown( function( event ) {
|
2012-11-06 09:47:25 -05:00
|
|
|
if ( 9 === event.which ) // tab
|
|
|
|
return;
|
|
|
|
if ( 13 === event.which ) // enter
|
2013-08-15 12:25:12 -04:00
|
|
|
this.click();
|
2012-11-06 09:47:25 -05:00
|
|
|
event.preventDefault();
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
2015-07-10 17:22:26 -04:00
|
|
|
$( '.collapse-sidebar' ).on( 'click', function() {
|
2016-09-01 01:55:27 -04:00
|
|
|
api.state( 'paneVisible' ).set( ! api.state( 'paneVisible' ).get() );
|
|
|
|
});
|
|
|
|
|
|
|
|
api.state( 'paneVisible' ).bind( function( paneVisible ) {
|
2016-10-30 00:23:44 -04:00
|
|
|
overlay.toggleClass( 'preview-only', ! paneVisible );
|
2016-09-01 01:55:27 -04:00
|
|
|
overlay.toggleClass( 'expanded', paneVisible );
|
|
|
|
overlay.toggleClass( 'collapsed', ! paneVisible );
|
|
|
|
|
|
|
|
if ( ! paneVisible ) {
|
|
|
|
$( '.collapse-sidebar' ).attr({ 'aria-expanded': 'false', 'aria-label': api.l10n.expandSidebar });
|
2015-07-10 17:22:26 -04:00
|
|
|
} else {
|
2016-09-01 01:55:27 -04:00
|
|
|
$( '.collapse-sidebar' ).attr({ 'aria-expanded': 'true', 'aria-label': api.l10n.collapseSidebar });
|
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
2016-05-02 15:52:28 -04:00
|
|
|
// Keyboard shortcuts - esc to exit section/panel.
|
|
|
|
$( 'body' ).on( 'keydown', function( event ) {
|
|
|
|
var collapsedObject, expandedControls = [], expandedSections = [], expandedPanels = [];
|
|
|
|
|
|
|
|
if ( 27 !== event.which ) { // Esc.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-11-04 13:08:33 -04:00
|
|
|
/*
|
|
|
|
* Abort if the event target is not the body (the default) and not inside of #customize-controls.
|
|
|
|
* This ensures that ESC meant to collapse a modal dialog or a TinyMCE toolbar won't collapse something else.
|
|
|
|
*/
|
|
|
|
if ( ! $( event.target ).is( 'body' ) && ! $.contains( $( '#customize-controls' )[0], event.target ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-05-02 15:52:28 -04:00
|
|
|
// Check for expanded expandable controls (e.g. widgets and nav menus items), sections, and panels.
|
|
|
|
api.control.each( function( control ) {
|
|
|
|
if ( control.expanded && control.expanded() && _.isFunction( control.collapse ) ) {
|
|
|
|
expandedControls.push( control );
|
|
|
|
}
|
|
|
|
});
|
|
|
|
api.section.each( function( section ) {
|
|
|
|
if ( section.expanded() ) {
|
|
|
|
expandedSections.push( section );
|
|
|
|
}
|
|
|
|
});
|
|
|
|
api.panel.each( function( panel ) {
|
|
|
|
if ( panel.expanded() ) {
|
|
|
|
expandedPanels.push( panel );
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Skip collapsing expanded controls if there are no expanded sections.
|
|
|
|
if ( expandedControls.length > 0 && 0 === expandedSections.length ) {
|
|
|
|
expandedControls.length = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Collapse the most granular expanded object.
|
|
|
|
collapsedObject = expandedControls[0] || expandedSections[0] || expandedPanels[0];
|
|
|
|
if ( collapsedObject ) {
|
|
|
|
collapsedObject.collapse();
|
|
|
|
event.preventDefault();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2016-04-17 11:41:27 -04:00
|
|
|
$( '.customize-controls-preview-toggle' ).on( 'click', function() {
|
2016-10-30 00:23:44 -04:00
|
|
|
api.state( 'paneVisible' ).set( ! api.state( 'paneVisible' ).get() );
|
2015-02-09 07:36:28 -05:00
|
|
|
});
|
|
|
|
|
2016-10-21 02:37:30 -04:00
|
|
|
/*
|
|
|
|
* Sticky header feature.
|
|
|
|
*/
|
|
|
|
(function initStickyHeaders() {
|
|
|
|
var parentContainer = $( '.wp-full-overlay-sidebar-content' ),
|
|
|
|
changeContainer, getHeaderHeight, releaseStickyHeader, resetStickyHeader, positionStickyHeader,
|
|
|
|
activeHeader, lastScrollTop;
|
|
|
|
|
2016-11-23 01:05:32 -05:00
|
|
|
/**
|
|
|
|
* Determine which panel or section is currently expanded.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
|
|
|
* @access private
|
|
|
|
*
|
|
|
|
* @param {wp.customize.Panel|wp.customize.Section} container Construct.
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
2016-10-21 02:37:30 -04:00
|
|
|
changeContainer = function( container ) {
|
|
|
|
var newInstance = container,
|
|
|
|
expandedSection = api.state( 'expandedSection' ).get(),
|
|
|
|
expandedPanel = api.state( 'expandedPanel' ).get(),
|
|
|
|
headerElement;
|
|
|
|
|
|
|
|
// Release previously active header element.
|
|
|
|
if ( activeHeader && activeHeader.element ) {
|
|
|
|
releaseStickyHeader( activeHeader.element );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ! newInstance ) {
|
|
|
|
if ( ! expandedSection && expandedPanel && expandedPanel.contentContainer ) {
|
|
|
|
newInstance = expandedPanel;
|
|
|
|
} else if ( ! expandedPanel && expandedSection && expandedSection.contentContainer ) {
|
|
|
|
newInstance = expandedSection;
|
|
|
|
} else {
|
|
|
|
activeHeader = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
headerElement = newInstance.contentContainer.find( '.customize-section-title, .panel-meta' ).first();
|
|
|
|
if ( headerElement.length ) {
|
|
|
|
activeHeader = {
|
|
|
|
instance: newInstance,
|
|
|
|
element: headerElement,
|
|
|
|
parent: headerElement.closest( '.customize-pane-child' ),
|
|
|
|
height: getHeaderHeight( headerElement )
|
|
|
|
};
|
|
|
|
if ( expandedSection ) {
|
|
|
|
resetStickyHeader( activeHeader.element, activeHeader.parent );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
activeHeader = false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
api.state( 'expandedSection' ).bind( changeContainer );
|
|
|
|
api.state( 'expandedPanel' ).bind( changeContainer );
|
|
|
|
|
|
|
|
// Throttled scroll event handler.
|
|
|
|
parentContainer.on( 'scroll', _.throttle( function() {
|
|
|
|
if ( ! activeHeader ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var scrollTop = parentContainer.scrollTop(),
|
|
|
|
isScrollingUp = ( lastScrollTop ) ? scrollTop <= lastScrollTop : true;
|
|
|
|
|
|
|
|
lastScrollTop = scrollTop;
|
|
|
|
positionStickyHeader( activeHeader, scrollTop, isScrollingUp );
|
|
|
|
}, 8 ) );
|
|
|
|
|
|
|
|
// Release header element if it is sticky.
|
|
|
|
releaseStickyHeader = function( headerElement ) {
|
|
|
|
if ( ! headerElement.hasClass( 'is-sticky' ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
headerElement
|
|
|
|
.removeClass( 'is-sticky' )
|
|
|
|
.addClass( 'maybe-sticky is-in-view' )
|
|
|
|
.css( 'top', parentContainer.scrollTop() + 'px' );
|
|
|
|
};
|
|
|
|
|
|
|
|
// Reset position of the sticky header.
|
|
|
|
resetStickyHeader = function( headerElement, headerParent ) {
|
|
|
|
headerElement
|
|
|
|
.removeClass( 'maybe-sticky is-in-view' )
|
|
|
|
.css( {
|
|
|
|
width: '',
|
|
|
|
top: ''
|
|
|
|
} );
|
|
|
|
headerParent.css( 'padding-top', '' );
|
|
|
|
};
|
|
|
|
|
2016-11-23 01:05:32 -05:00
|
|
|
/**
|
|
|
|
* Get header height.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
|
|
|
* @access private
|
|
|
|
*
|
|
|
|
* @param {jQuery} headerElement Header element.
|
|
|
|
* @returns {number} Height.
|
|
|
|
*/
|
2016-10-21 02:37:30 -04:00
|
|
|
getHeaderHeight = function( headerElement ) {
|
|
|
|
var height = headerElement.data( 'height' );
|
|
|
|
if ( ! height ) {
|
|
|
|
height = headerElement.outerHeight();
|
|
|
|
headerElement.data( 'height', height );
|
|
|
|
}
|
|
|
|
return height;
|
|
|
|
};
|
|
|
|
|
2016-11-23 01:05:32 -05:00
|
|
|
/**
|
|
|
|
* Reposition header on throttled `scroll` event.
|
|
|
|
*
|
|
|
|
* @since 4.7.0
|
|
|
|
* @access private
|
|
|
|
*
|
|
|
|
* @param {object} header Header.
|
|
|
|
* @param {number} scrollTop Scroll top.
|
|
|
|
* @param {boolean} isScrollingUp Is scrolling up?
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
2016-10-21 02:37:30 -04:00
|
|
|
positionStickyHeader = function( header, scrollTop, isScrollingUp ) {
|
|
|
|
var headerElement = header.element,
|
|
|
|
headerParent = header.parent,
|
|
|
|
headerHeight = header.height,
|
|
|
|
headerTop = parseInt( headerElement.css( 'top' ), 10 ),
|
|
|
|
maybeSticky = headerElement.hasClass( 'maybe-sticky' ),
|
|
|
|
isSticky = headerElement.hasClass( 'is-sticky' ),
|
|
|
|
isInView = headerElement.hasClass( 'is-in-view' );
|
|
|
|
|
|
|
|
// When scrolling down, gradually hide sticky header.
|
|
|
|
if ( ! isScrollingUp ) {
|
|
|
|
if ( isSticky ) {
|
|
|
|
headerTop = scrollTop;
|
|
|
|
headerElement
|
|
|
|
.removeClass( 'is-sticky' )
|
|
|
|
.css( {
|
|
|
|
top: headerTop + 'px',
|
|
|
|
width: ''
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
if ( isInView && scrollTop > headerTop + headerHeight ) {
|
|
|
|
headerElement.removeClass( 'is-in-view' );
|
|
|
|
headerParent.css( 'padding-top', '' );
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Scrolling up.
|
|
|
|
if ( ! maybeSticky && scrollTop >= headerHeight ) {
|
|
|
|
maybeSticky = true;
|
|
|
|
headerElement.addClass( 'maybe-sticky' );
|
|
|
|
} else if ( 0 === scrollTop ) {
|
|
|
|
// Reset header in base position.
|
|
|
|
headerElement
|
|
|
|
.removeClass( 'maybe-sticky is-in-view is-sticky' )
|
|
|
|
.css( {
|
|
|
|
top: '',
|
|
|
|
width: ''
|
|
|
|
} );
|
|
|
|
headerParent.css( 'padding-top', '' );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( isInView && ! isSticky ) {
|
|
|
|
// Header is in the view but is not yet sticky.
|
|
|
|
if ( headerTop >= scrollTop ) {
|
|
|
|
// Header is fully visible.
|
|
|
|
headerElement
|
|
|
|
.addClass( 'is-sticky' )
|
|
|
|
.css( {
|
|
|
|
top: '',
|
|
|
|
width: headerParent.outerWidth() + 'px'
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
} else if ( maybeSticky && ! isInView ) {
|
|
|
|
// Header is out of the view.
|
|
|
|
headerElement
|
|
|
|
.addClass( 'is-in-view' )
|
|
|
|
.css( 'top', ( scrollTop - headerHeight ) + 'px' );
|
|
|
|
headerParent.css( 'padding-top', headerHeight + 'px' );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}());
|
|
|
|
|
2016-02-15 20:57:26 -05:00
|
|
|
// Previewed device bindings.
|
|
|
|
api.previewedDevice = new api.Value();
|
|
|
|
|
|
|
|
// Set the default device.
|
|
|
|
api.bind( 'ready', function() {
|
|
|
|
_.find( api.settings.previewableDevices, function( value, key ) {
|
|
|
|
if ( true === value['default'] ) {
|
|
|
|
api.previewedDevice.set( key );
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Set the toggled device.
|
|
|
|
footerActions.find( '.devices button' ).on( 'click', function( event ) {
|
|
|
|
api.previewedDevice.set( $( event.currentTarget ).data( 'device' ) );
|
|
|
|
});
|
|
|
|
|
|
|
|
// Bind device changes.
|
|
|
|
api.previewedDevice.bind( function( newDevice ) {
|
|
|
|
var overlay = $( '.wp-full-overlay' ),
|
|
|
|
devices = '';
|
|
|
|
|
|
|
|
footerActions.find( '.devices button' )
|
|
|
|
.removeClass( 'active' )
|
|
|
|
.attr( 'aria-pressed', false );
|
|
|
|
|
|
|
|
footerActions.find( '.devices .preview-' + newDevice )
|
|
|
|
.addClass( 'active' )
|
|
|
|
.attr( 'aria-pressed', true );
|
|
|
|
|
|
|
|
$.each( api.settings.previewableDevices, function( device ) {
|
|
|
|
devices += ' preview-' + device;
|
|
|
|
} );
|
|
|
|
|
|
|
|
overlay
|
|
|
|
.removeClass( devices )
|
|
|
|
.addClass( 'preview-' + newDevice );
|
|
|
|
} );
|
|
|
|
|
2014-07-08 15:53:15 -04:00
|
|
|
// Bind site title display to the corresponding field.
|
|
|
|
if ( title.length ) {
|
2016-01-23 18:15:27 -05:00
|
|
|
api( 'blogname', function( setting ) {
|
|
|
|
var updateTitle = function() {
|
|
|
|
title.text( $.trim( setting() ) || api.l10n.untitledBlogName );
|
|
|
|
};
|
|
|
|
setting.bind( updateTitle );
|
|
|
|
updateTitle();
|
2014-07-08 15:53:15 -04:00
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
2015-09-05 15:53:24 -04:00
|
|
|
/*
|
|
|
|
* Create a postMessage connection with a parent frame,
|
|
|
|
* in case the Customizer frame was opened with the Customize loader.
|
|
|
|
*
|
|
|
|
* @see wp.customize.Loader
|
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
parent = new api.Messenger({
|
|
|
|
url: api.settings.url.parent,
|
|
|
|
channel: 'loader'
|
|
|
|
});
|
|
|
|
|
2015-09-05 15:53:24 -04:00
|
|
|
/*
|
|
|
|
* If we receive a 'back' event, we're inside an iframe.
|
|
|
|
* Send any clicks to the 'Return' link to the parent page.
|
|
|
|
*/
|
2012-08-22 20:04:18 -04:00
|
|
|
parent.bind( 'back', function() {
|
2014-07-08 14:19:14 -04:00
|
|
|
closeBtn.on( 'click.customize-controls-close', function( event ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
event.preventDefault();
|
|
|
|
parent.send( 'close' );
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2014-07-08 13:04:15 -04:00
|
|
|
// Prompt user with AYS dialog if leaving the Customizer with unsaved changes
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
$( window ).on( 'beforeunload.customize-confirm', function () {
|
2014-07-08 13:04:15 -04:00
|
|
|
if ( ! api.state( 'saved' )() ) {
|
2015-02-24 23:17:27 -05:00
|
|
|
setTimeout( function() {
|
2015-02-24 15:31:24 -05:00
|
|
|
overlay.removeClass( 'customize-loading' );
|
|
|
|
}, 1 );
|
2014-07-08 13:04:15 -04:00
|
|
|
return api.l10n.saveAlert;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Pass events through to the parent.
|
2014-07-08 13:04:15 -04:00
|
|
|
$.each( [ 'saved', 'change' ], function ( i, event ) {
|
|
|
|
api.bind( event, function() {
|
|
|
|
parent.send( event );
|
|
|
|
});
|
|
|
|
} );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-03-25 13:26:26 -04:00
|
|
|
// Pass titles to the parent
|
|
|
|
api.bind( 'title', function( newTitle ) {
|
|
|
|
parent.send( 'title', newTitle );
|
|
|
|
});
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
parent.send( 'changeset-uuid', api.settings.changeset.uuid );
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Initialize the connection with the parent frame.
|
|
|
|
parent.send( 'ready' );
|
|
|
|
|
|
|
|
// Control visibility for default controls
|
|
|
|
$.each({
|
|
|
|
'background_image': {
|
Customize: Improve custom background properties UI.
Introduces new control for managing the background position. Adds control for setting the `background-size`.
Props cdog, celloexpressions, grapplerulrich, MikeHansenMe, FolioVision, afercia, helen, melchoyce, karmatosed, westonruter, Kelderic, sebastian.pisula.
Fixes #22058.
Built from https://develop.svn.wordpress.org/trunk@38948
git-svn-id: http://core.svn.wordpress.org/trunk@38891 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-26 02:52:29 -04:00
|
|
|
controls: [ 'background_preset', 'background_position', 'background_size', 'background_repeat', 'background_attachment' ],
|
2013-11-15 01:08:10 -05:00
|
|
|
callback: function( to ) { return !! to; }
|
2012-08-22 20:04:18 -04:00
|
|
|
},
|
|
|
|
'show_on_front': {
|
|
|
|
controls: [ 'page_on_front', 'page_for_posts' ],
|
2013-11-15 01:08:10 -05:00
|
|
|
callback: function( to ) { return 'page' === to; }
|
2012-08-22 20:04:18 -04:00
|
|
|
},
|
|
|
|
'header_textcolor': {
|
|
|
|
controls: [ 'header_textcolor' ],
|
2013-11-15 01:08:10 -05:00
|
|
|
callback: function( to ) { return 'blank' !== to; }
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
|
|
|
}, function( settingId, o ) {
|
|
|
|
api( settingId, function( setting ) {
|
|
|
|
$.each( o.controls, function( i, controlId ) {
|
|
|
|
api.control( controlId, function( control ) {
|
|
|
|
var visibility = function( to ) {
|
|
|
|
control.container.toggle( o.callback( to ) );
|
|
|
|
};
|
|
|
|
|
|
|
|
visibility( setting.get() );
|
|
|
|
setting.bind( visibility );
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
Customize: Improve custom background properties UI.
Introduces new control for managing the background position. Adds control for setting the `background-size`.
Props cdog, celloexpressions, grapplerulrich, MikeHansenMe, FolioVision, afercia, helen, melchoyce, karmatosed, westonruter, Kelderic, sebastian.pisula.
Fixes #22058.
Built from https://develop.svn.wordpress.org/trunk@38948
git-svn-id: http://core.svn.wordpress.org/trunk@38891 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-26 02:52:29 -04:00
|
|
|
api.control( 'background_preset', function( control ) {
|
|
|
|
var visibility, defaultValues, values, toggleVisibility, updateSettings, preset;
|
|
|
|
|
|
|
|
visibility = { // position, size, repeat, attachment
|
|
|
|
'default': [ false, false, false, false ],
|
|
|
|
'fill': [ true, false, false, false ],
|
|
|
|
'fit': [ true, false, true, false ],
|
|
|
|
'repeat': [ true, false, false, true ],
|
|
|
|
'custom': [ true, true, true, true ]
|
|
|
|
};
|
|
|
|
|
|
|
|
defaultValues = [
|
|
|
|
_wpCustomizeBackground.defaults['default-position-x'],
|
|
|
|
_wpCustomizeBackground.defaults['default-position-y'],
|
|
|
|
_wpCustomizeBackground.defaults['default-size'],
|
|
|
|
_wpCustomizeBackground.defaults['default-repeat'],
|
|
|
|
_wpCustomizeBackground.defaults['default-attachment']
|
|
|
|
];
|
|
|
|
|
|
|
|
values = { // position_x, position_y, size, repeat, attachment
|
|
|
|
'default': defaultValues,
|
|
|
|
'fill': [ 'left', 'top', 'cover', 'no-repeat', 'fixed' ],
|
|
|
|
'fit': [ 'left', 'top', 'contain', 'no-repeat', 'fixed' ],
|
|
|
|
'repeat': [ 'left', 'top', 'auto', 'repeat', 'scroll' ]
|
|
|
|
};
|
|
|
|
|
|
|
|
// @todo These should actually toggle the active state, but without the preview overriding the state in data.activeControls.
|
|
|
|
toggleVisibility = function( preset ) {
|
2016-10-27 01:02:35 -04:00
|
|
|
_.each( [ 'background_position', 'background_size', 'background_repeat', 'background_attachment' ], function( controlId, i ) {
|
|
|
|
var control = api.control( controlId );
|
|
|
|
if ( control ) {
|
|
|
|
control.container.toggle( visibility[ preset ][ i ] );
|
|
|
|
}
|
|
|
|
} );
|
Customize: Improve custom background properties UI.
Introduces new control for managing the background position. Adds control for setting the `background-size`.
Props cdog, celloexpressions, grapplerulrich, MikeHansenMe, FolioVision, afercia, helen, melchoyce, karmatosed, westonruter, Kelderic, sebastian.pisula.
Fixes #22058.
Built from https://develop.svn.wordpress.org/trunk@38948
git-svn-id: http://core.svn.wordpress.org/trunk@38891 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-26 02:52:29 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
updateSettings = function( preset ) {
|
2016-10-27 01:02:35 -04:00
|
|
|
_.each( [ 'background_position_x', 'background_position_y', 'background_size', 'background_repeat', 'background_attachment' ], function( settingId, i ) {
|
|
|
|
var setting = api( settingId );
|
|
|
|
if ( setting ) {
|
|
|
|
setting.set( values[ preset ][ i ] );
|
|
|
|
}
|
|
|
|
} );
|
Customize: Improve custom background properties UI.
Introduces new control for managing the background position. Adds control for setting the `background-size`.
Props cdog, celloexpressions, grapplerulrich, MikeHansenMe, FolioVision, afercia, helen, melchoyce, karmatosed, westonruter, Kelderic, sebastian.pisula.
Fixes #22058.
Built from https://develop.svn.wordpress.org/trunk@38948
git-svn-id: http://core.svn.wordpress.org/trunk@38891 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-26 02:52:29 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
preset = control.setting.get();
|
|
|
|
toggleVisibility( preset );
|
|
|
|
|
|
|
|
control.setting.bind( 'change', function( preset ) {
|
|
|
|
toggleVisibility( preset );
|
|
|
|
if ( 'custom' !== preset ) {
|
|
|
|
updateSettings( preset );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
|
|
|
api.control( 'background_repeat', function( control ) {
|
|
|
|
control.elements[0].unsync( api( 'background_repeat' ) );
|
|
|
|
|
|
|
|
control.element = new api.Element( control.container.find( 'input' ) );
|
|
|
|
control.element.set( 'no-repeat' !== control.setting() );
|
|
|
|
|
|
|
|
control.element.bind( function( to ) {
|
|
|
|
control.setting.set( to ? 'repeat' : 'no-repeat' );
|
|
|
|
} );
|
|
|
|
|
|
|
|
control.setting.bind( function( to ) {
|
|
|
|
control.element.set( 'no-repeat' !== to );
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
|
|
|
api.control( 'background_attachment', function( control ) {
|
|
|
|
control.elements[0].unsync( api( 'background_attachment' ) );
|
|
|
|
|
|
|
|
control.element = new api.Element( control.container.find( 'input' ) );
|
|
|
|
control.element.set( 'fixed' !== control.setting() );
|
|
|
|
|
|
|
|
control.element.bind( function( to ) {
|
|
|
|
control.setting.set( to ? 'scroll' : 'fixed' );
|
|
|
|
} );
|
|
|
|
|
|
|
|
control.setting.bind( function( to ) {
|
|
|
|
control.element.set( 'fixed' !== to );
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Juggle the two controls that use header_textcolor
|
|
|
|
api.control( 'display_header_text', function( control ) {
|
|
|
|
var last = '';
|
|
|
|
|
|
|
|
control.elements[0].unsync( api( 'header_textcolor' ) );
|
|
|
|
|
|
|
|
control.element = new api.Element( control.container.find('input') );
|
|
|
|
control.element.set( 'blank' !== control.setting() );
|
|
|
|
|
|
|
|
control.element.bind( function( to ) {
|
|
|
|
if ( ! to )
|
|
|
|
last = api( 'header_textcolor' ).get();
|
|
|
|
|
|
|
|
control.setting.set( to ? last : 'blank' );
|
|
|
|
});
|
|
|
|
|
|
|
|
control.setting.bind( function( to ) {
|
|
|
|
control.element.set( 'blank' !== to );
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2015-06-27 15:59:25 -04:00
|
|
|
// Change previewed URL to the homepage when changing the page_on_front.
|
|
|
|
api( 'show_on_front', 'page_on_front', function( showOnFront, pageOnFront ) {
|
|
|
|
var updatePreviewUrl = function() {
|
|
|
|
if ( showOnFront() === 'page' && parseInt( pageOnFront(), 10 ) > 0 ) {
|
|
|
|
api.previewer.previewUrl.set( api.settings.url.home );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
showOnFront.bind( updatePreviewUrl );
|
|
|
|
pageOnFront.bind( updatePreviewUrl );
|
|
|
|
});
|
|
|
|
|
|
|
|
// Change the previewed URL to the selected page when changing the page_for_posts.
|
|
|
|
api( 'page_for_posts', function( setting ) {
|
|
|
|
setting.bind(function( pageId ) {
|
|
|
|
pageId = parseInt( pageId, 10 );
|
|
|
|
if ( pageId > 0 ) {
|
|
|
|
api.previewer.previewUrl.set( api.settings.url.home + '?page_id=' + pageId );
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2016-11-06 14:09:33 -05:00
|
|
|
// Allow tabs to be entered in Custom CSS textarea.
|
|
|
|
api.control( 'custom_css', function setupCustomCssControl( control ) {
|
|
|
|
control.deferred.embedded.done( function allowTabs() {
|
|
|
|
var $textarea = control.container.find( 'textarea' ), textarea = $textarea[0];
|
|
|
|
|
|
|
|
$textarea.on( 'blur', function onBlur() {
|
|
|
|
$textarea.data( 'next-tab-blurs', false );
|
|
|
|
} );
|
|
|
|
|
|
|
|
$textarea.on( 'keydown', function onKeydown( event ) {
|
2016-12-09 19:44:40 -05:00
|
|
|
var selectionStart, selectionEnd, value, tabKeyCode = 9, escKeyCode = 27;
|
2016-11-06 14:09:33 -05:00
|
|
|
|
|
|
|
if ( escKeyCode === event.keyCode ) {
|
|
|
|
if ( ! $textarea.data( 'next-tab-blurs' ) ) {
|
|
|
|
$textarea.data( 'next-tab-blurs', true );
|
|
|
|
event.stopPropagation(); // Prevent collapsing the section.
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Short-circuit if tab key is not being pressed or if a modifier key *is* being pressed.
|
|
|
|
if ( tabKeyCode !== event.keyCode || event.ctrlKey || event.altKey || event.shiftKey ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Prevent capturing Tab characters if Esc was pressed.
|
|
|
|
if ( $textarea.data( 'next-tab-blurs' ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
selectionStart = textarea.selectionStart;
|
|
|
|
selectionEnd = textarea.selectionEnd;
|
|
|
|
value = textarea.value;
|
|
|
|
|
|
|
|
if ( selectionStart >= 0 ) {
|
|
|
|
textarea.value = value.substring( 0, selectionStart ).concat( '\t', value.substring( selectionEnd ) );
|
|
|
|
$textarea.selectionStart = textarea.selectionEnd = selectionStart + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
event.stopPropagation();
|
|
|
|
event.preventDefault();
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
} );
|
2016-11-14 22:47:30 -05:00
|
|
|
|
|
|
|
// Toggle visibility of Header Video notice when active state change.
|
|
|
|
api.control( 'header_video', function( headerVideoControl ) {
|
|
|
|
headerVideoControl.deferred.embedded.done( function() {
|
|
|
|
var toggleNotice = function() {
|
|
|
|
var section = api.section( headerVideoControl.section() ), notice;
|
|
|
|
if ( ! section ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
notice = section.container.find( '.header-video-not-currently-previewable:first' );
|
|
|
|
if ( headerVideoControl.active.get() ) {
|
|
|
|
notice.stop().slideUp( 'fast' );
|
|
|
|
} else {
|
|
|
|
notice.stop().slideDown( 'fast' );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
toggleNotice();
|
|
|
|
headerVideoControl.active.bind( toggleNotice );
|
|
|
|
} );
|
|
|
|
} );
|
2016-11-06 14:09:33 -05:00
|
|
|
|
2016-06-14 15:17:28 -04:00
|
|
|
// Update the setting validities.
|
|
|
|
api.previewer.bind( 'selective-refresh-setting-validities', function handleSelectiveRefreshedSettingValidities( settingValidities ) {
|
|
|
|
api._handleSettingValidities( {
|
|
|
|
settingValidities: settingValidities,
|
|
|
|
focusInvalidControl: false
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
2016-02-19 13:41:28 -05:00
|
|
|
// Focus on the control that is associated with the given setting.
|
|
|
|
api.previewer.bind( 'focus-control-for-setting', function( settingId ) {
|
2016-12-20 17:05:43 -05:00
|
|
|
var matchedControls = [];
|
2016-02-19 13:41:28 -05:00
|
|
|
api.control.each( function( control ) {
|
|
|
|
var settingIds = _.pluck( control.settings, 'id' );
|
|
|
|
if ( -1 !== _.indexOf( settingIds, settingId ) ) {
|
2016-12-20 17:05:43 -05:00
|
|
|
matchedControls.push( control );
|
2016-02-19 13:41:28 -05:00
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
2016-12-20 17:05:43 -05:00
|
|
|
// Focus on the matched control with the lowest priority (appearing higher).
|
|
|
|
if ( matchedControls.length ) {
|
|
|
|
matchedControls.sort( function( a, b ) {
|
|
|
|
return a.priority() - b.priority();
|
|
|
|
} );
|
|
|
|
matchedControls[0].focus();
|
2016-02-19 13:41:28 -05:00
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Refresh the preview when it requests.
|
|
|
|
api.previewer.bind( 'refresh', function() {
|
|
|
|
api.previewer.refresh();
|
|
|
|
});
|
|
|
|
|
2016-10-26 16:03:32 -04:00
|
|
|
// Update the edit shortcut visibility state.
|
2016-11-04 13:13:57 -04:00
|
|
|
api.state( 'paneVisible' ).bind( function( isPaneVisible ) {
|
|
|
|
var isMobileScreen;
|
|
|
|
if ( window.matchMedia ) {
|
|
|
|
isMobileScreen = window.matchMedia( 'screen and ( max-width: 640px )' ).matches;
|
|
|
|
} else {
|
|
|
|
isMobileScreen = $( window ).width() <= 640;
|
|
|
|
}
|
|
|
|
api.state( 'editShortcutVisibility' ).set( isPaneVisible || isMobileScreen ? 'visible' : 'hidden' );
|
|
|
|
} );
|
|
|
|
if ( window.matchMedia ) {
|
|
|
|
window.matchMedia( 'screen and ( max-width: 640px )' ).addListener( function() {
|
|
|
|
var state = api.state( 'paneVisible' );
|
|
|
|
state.callbacks.fireWith( state, [ state.get(), state.get() ] );
|
|
|
|
} );
|
|
|
|
}
|
2016-10-26 16:03:32 -04:00
|
|
|
api.previewer.bind( 'edit-shortcut-visibility', function( visibility ) {
|
|
|
|
api.state( 'editShortcutVisibility' ).set( visibility );
|
|
|
|
} );
|
|
|
|
api.state( 'editShortcutVisibility' ).bind( function( visibility ) {
|
|
|
|
api.previewer.send( 'edit-shortcut-visibility', visibility );
|
|
|
|
} );
|
|
|
|
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
// Autosave changeset.
|
|
|
|
( function() {
|
|
|
|
var timeoutId, updateChangesetWithReschedule, scheduleChangesetUpdate, updatePending = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Request changeset update and then re-schedule the next changeset update time.
|
|
|
|
*
|
2016-11-23 01:05:32 -05:00
|
|
|
* @since 4.7.0
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
updateChangesetWithReschedule = function() {
|
|
|
|
if ( ! updatePending ) {
|
|
|
|
updatePending = true;
|
|
|
|
api.requestChangesetUpdate().always( function() {
|
|
|
|
updatePending = false;
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
scheduleChangesetUpdate();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Schedule changeset update.
|
|
|
|
*
|
2016-11-23 01:05:32 -05:00
|
|
|
* @since 4.7.0
|
Customize: Implement customized state persistence with changesets.
Includes infrastructure developed in the Customize Snapshots feature plugin.
See https://make.wordpress.org/core/2016/10/12/customize-changesets-technical-design-decisions/
Props westonruter, valendesigns, utkarshpatel, stubgo, lgedeon, ocean90, ryankienstra, mihai2u, dlh, aaroncampbell, jonathanbardo, jorbin.
See #28721.
See #31089.
Fixes #30937.
Fixes #31517.
Fixes #30028.
Fixes #23225.
Fixes #34142.
Fixes #36485.
Built from https://develop.svn.wordpress.org/trunk@38810
git-svn-id: http://core.svn.wordpress.org/trunk@38753 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-18 16:05:31 -04:00
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
scheduleChangesetUpdate = function() {
|
|
|
|
clearTimeout( timeoutId );
|
|
|
|
timeoutId = setTimeout( function() {
|
|
|
|
updateChangesetWithReschedule();
|
|
|
|
}, api.settings.timeouts.changesetAutoSave );
|
|
|
|
};
|
|
|
|
|
|
|
|
// Start auto-save interval for updating changeset.
|
|
|
|
scheduleChangesetUpdate();
|
|
|
|
|
|
|
|
// Save changeset when focus removed from window.
|
|
|
|
$( window ).on( 'blur.wp-customize-changeset-update', function() {
|
|
|
|
updateChangesetWithReschedule();
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Save changeset before unloading window.
|
|
|
|
$( window ).on( 'beforeunload.wp-customize-changeset-update', function() {
|
|
|
|
updateChangesetWithReschedule();
|
|
|
|
} );
|
|
|
|
} ());
|
|
|
|
|
2017-07-17 23:23:33 -04:00
|
|
|
// Make sure TinyMCE dialogs appear above Customizer UI.
|
|
|
|
$( document ).one( 'wp-before-tinymce-init', function() {
|
|
|
|
if ( ! window.tinymce.ui.FloatPanel.zIndex || window.tinymce.ui.FloatPanel.zIndex < 500001 ) {
|
|
|
|
window.tinymce.ui.FloatPanel.zIndex = 500001;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
api.trigger( 'ready' );
|
|
|
|
});
|
|
|
|
|
2012-11-06 09:47:25 -05:00
|
|
|
})( wp, jQuery );
|