Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93

Warning: Undefined array key "page_file_edit_line" in /home/sportsfever/public_html/filemanger/edit_text_line.php on line 32
/home/sportsfe.../httpdocs/wp-admin/js
File: customize-controls.js
isProcessingComplete = function() {
[6500] Fix | Delete
return 0 === api.state( 'processing' ).get();
[6501] Fix | Delete
};
[6502] Fix | Delete
if ( isProcessingComplete() ) {
[6503] Fix | Delete
originalRefresh.call( previewer );
[6504] Fix | Delete
} else {
[6505] Fix | Delete
refreshOnceProcessingComplete = function() {
[6506] Fix | Delete
if ( isProcessingComplete() ) {
[6507] Fix | Delete
originalRefresh.call( previewer );
[6508] Fix | Delete
api.state( 'processing' ).unbind( refreshOnceProcessingComplete );
[6509] Fix | Delete
}
[6510] Fix | Delete
};
[6511] Fix | Delete
api.state( 'processing' ).bind( refreshOnceProcessingComplete );
[6512] Fix | Delete
}
[6513] Fix | Delete
};
[6514] Fix | Delete
}( previewer.refresh ) ),
[6515] Fix | Delete
previewer.refreshBuffer
[6516] Fix | Delete
);
[6517] Fix | Delete
[6518] Fix | Delete
previewer.container = api.ensure( params.container );
[6519] Fix | Delete
previewer.allowedUrls = params.allowedUrls;
[6520] Fix | Delete
[6521] Fix | Delete
params.url = window.location.href;
[6522] Fix | Delete
[6523] Fix | Delete
api.Messenger.prototype.initialize.call( previewer, params );
[6524] Fix | Delete
[6525] Fix | Delete
urlParser.href = previewer.origin();
[6526] Fix | Delete
previewer.add( 'scheme', urlParser.protocol.replace( /:$/, '' ) );
[6527] Fix | Delete
[6528] Fix | Delete
/*
[6529] Fix | Delete
* Limit the URL to internal, front-end links.
[6530] Fix | Delete
*
[6531] Fix | Delete
* If the front end and the admin are served from the same domain, load the
[6532] Fix | Delete
* preview over ssl if the Customizer is being loaded over ssl. This avoids
[6533] Fix | Delete
* insecure content warnings. This is not attempted if the admin and front end
[6534] Fix | Delete
* are on different domains to avoid the case where the front end doesn't have
[6535] Fix | Delete
* ssl certs.
[6536] Fix | Delete
*/
[6537] Fix | Delete
[6538] Fix | Delete
previewer.add( 'previewUrl', params.previewUrl ).setter( function( to ) {
[6539] Fix | Delete
var result = null, urlParser, queryParams, parsedAllowedUrl, parsedCandidateUrls = [];
[6540] Fix | Delete
urlParser = document.createElement( 'a' );
[6541] Fix | Delete
urlParser.href = to;
[6542] Fix | Delete
[6543] Fix | Delete
// Abort if URL is for admin or (static) files in wp-includes or wp-content.
[6544] Fix | Delete
if ( /\/wp-(admin|includes|content)(\/|$)/.test( urlParser.pathname ) ) {
[6545] Fix | Delete
return null;
[6546] Fix | Delete
}
[6547] Fix | Delete
[6548] Fix | Delete
// Remove state query params.
[6549] Fix | Delete
if ( urlParser.search.length > 1 ) {
[6550] Fix | Delete
queryParams = api.utils.parseQueryString( urlParser.search.substr( 1 ) );
[6551] Fix | Delete
delete queryParams.customize_changeset_uuid;
[6552] Fix | Delete
delete queryParams.customize_theme;
[6553] Fix | Delete
delete queryParams.customize_messenger_channel;
[6554] Fix | Delete
delete queryParams.customize_autosaved;
[6555] Fix | Delete
if ( _.isEmpty( queryParams ) ) {
[6556] Fix | Delete
urlParser.search = '';
[6557] Fix | Delete
} else {
[6558] Fix | Delete
urlParser.search = $.param( queryParams );
[6559] Fix | Delete
}
[6560] Fix | Delete
}
[6561] Fix | Delete
[6562] Fix | Delete
parsedCandidateUrls.push( urlParser );
[6563] Fix | Delete
[6564] Fix | Delete
// Prepend list with URL that matches the scheme/protocol of the iframe.
[6565] Fix | Delete
if ( previewer.scheme.get() + ':' !== urlParser.protocol ) {
[6566] Fix | Delete
urlParser = document.createElement( 'a' );
[6567] Fix | Delete
urlParser.href = parsedCandidateUrls[0].href;
[6568] Fix | Delete
urlParser.protocol = previewer.scheme.get() + ':';
[6569] Fix | Delete
parsedCandidateUrls.unshift( urlParser );
[6570] Fix | Delete
}
[6571] Fix | Delete
[6572] Fix | Delete
// Attempt to match the URL to the control frame's scheme and check if it's allowed. If not, try the original URL.
[6573] Fix | Delete
parsedAllowedUrl = document.createElement( 'a' );
[6574] Fix | Delete
_.find( parsedCandidateUrls, function( parsedCandidateUrl ) {
[6575] Fix | Delete
return ! _.isUndefined( _.find( previewer.allowedUrls, function( allowedUrl ) {
[6576] Fix | Delete
parsedAllowedUrl.href = allowedUrl;
[6577] Fix | Delete
if ( urlParser.protocol === parsedAllowedUrl.protocol && urlParser.host === parsedAllowedUrl.host && 0 === urlParser.pathname.indexOf( parsedAllowedUrl.pathname.replace( /\/$/, '' ) ) ) {
[6578] Fix | Delete
result = parsedCandidateUrl.href;
[6579] Fix | Delete
return true;
[6580] Fix | Delete
}
[6581] Fix | Delete
} ) );
[6582] Fix | Delete
} );
[6583] Fix | Delete
[6584] Fix | Delete
return result;
[6585] Fix | Delete
});
[6586] Fix | Delete
[6587] Fix | Delete
previewer.bind( 'ready', previewer.ready );
[6588] Fix | Delete
[6589] Fix | Delete
// Start listening for keep-alive messages when iframe first loads.
[6590] Fix | Delete
previewer.deferred.active.done( _.bind( previewer.keepPreviewAlive, previewer ) );
[6591] Fix | Delete
[6592] Fix | Delete
previewer.bind( 'synced', function() {
[6593] Fix | Delete
previewer.send( 'active' );
[6594] Fix | Delete
} );
[6595] Fix | Delete
[6596] Fix | Delete
// Refresh the preview when the URL is changed (but not yet).
[6597] Fix | Delete
previewer.previewUrl.bind( previewer.refresh );
[6598] Fix | Delete
[6599] Fix | Delete
previewer.scroll = 0;
[6600] Fix | Delete
previewer.bind( 'scroll', function( distance ) {
[6601] Fix | Delete
previewer.scroll = distance;
[6602] Fix | Delete
});
[6603] Fix | Delete
[6604] Fix | Delete
// Update the URL when the iframe sends a URL message, resetting scroll position. If URL is unchanged, then refresh.
[6605] Fix | Delete
previewer.bind( 'url', function( url ) {
[6606] Fix | Delete
var onUrlChange, urlChanged = false;
[6607] Fix | Delete
previewer.scroll = 0;
[6608] Fix | Delete
onUrlChange = function() {
[6609] Fix | Delete
urlChanged = true;
[6610] Fix | Delete
};
[6611] Fix | Delete
previewer.previewUrl.bind( onUrlChange );
[6612] Fix | Delete
previewer.previewUrl.set( url );
[6613] Fix | Delete
previewer.previewUrl.unbind( onUrlChange );
[6614] Fix | Delete
if ( ! urlChanged ) {
[6615] Fix | Delete
previewer.refresh();
[6616] Fix | Delete
}
[6617] Fix | Delete
} );
[6618] Fix | Delete
[6619] Fix | Delete
// Update the document title when the preview changes.
[6620] Fix | Delete
previewer.bind( 'documentTitle', function ( title ) {
[6621] Fix | Delete
api.setDocumentTitle( title );
[6622] Fix | Delete
} );
[6623] Fix | Delete
},
[6624] Fix | Delete
[6625] Fix | Delete
/**
[6626] Fix | Delete
* Handle the preview receiving the ready message.
[6627] Fix | Delete
*
[6628] Fix | Delete
* @since 4.7.0
[6629] Fix | Delete
* @access public
[6630] Fix | Delete
*
[6631] Fix | Delete
* @param {Object} data - Data from preview.
[6632] Fix | Delete
* @param {string} data.currentUrl - Current URL.
[6633] Fix | Delete
* @param {Object} data.activePanels - Active panels.
[6634] Fix | Delete
* @param {Object} data.activeSections Active sections.
[6635] Fix | Delete
* @param {Object} data.activeControls Active controls.
[6636] Fix | Delete
* @return {void}
[6637] Fix | Delete
*/
[6638] Fix | Delete
ready: function( data ) {
[6639] Fix | Delete
var previewer = this, synced = {}, constructs;
[6640] Fix | Delete
[6641] Fix | Delete
synced.settings = api.get();
[6642] Fix | Delete
synced['settings-modified-while-loading'] = previewer.settingsModifiedWhileLoading;
[6643] Fix | Delete
if ( 'resolved' !== previewer.deferred.active.state() || previewer.loading ) {
[6644] Fix | Delete
synced.scroll = previewer.scroll;
[6645] Fix | Delete
}
[6646] Fix | Delete
synced['edit-shortcut-visibility'] = api.state( 'editShortcutVisibility' ).get();
[6647] Fix | Delete
previewer.send( 'sync', synced );
[6648] Fix | Delete
[6649] Fix | Delete
// Set the previewUrl without causing the url to set the iframe.
[6650] Fix | Delete
if ( data.currentUrl ) {
[6651] Fix | Delete
previewer.previewUrl.unbind( previewer.refresh );
[6652] Fix | Delete
previewer.previewUrl.set( data.currentUrl );
[6653] Fix | Delete
previewer.previewUrl.bind( previewer.refresh );
[6654] Fix | Delete
}
[6655] Fix | Delete
[6656] Fix | Delete
/*
[6657] Fix | Delete
* Walk over all panels, sections, and controls and set their
[6658] Fix | Delete
* respective active states to true if the preview explicitly
[6659] Fix | Delete
* indicates as such.
[6660] Fix | Delete
*/
[6661] Fix | Delete
constructs = {
[6662] Fix | Delete
panel: data.activePanels,
[6663] Fix | Delete
section: data.activeSections,
[6664] Fix | Delete
control: data.activeControls
[6665] Fix | Delete
};
[6666] Fix | Delete
_( constructs ).each( function ( activeConstructs, type ) {
[6667] Fix | Delete
api[ type ].each( function ( construct, id ) {
[6668] Fix | Delete
var isDynamicallyCreated = _.isUndefined( api.settings[ type + 's' ][ id ] );
[6669] Fix | Delete
[6670] Fix | Delete
/*
[6671] Fix | Delete
* If the construct was created statically in PHP (not dynamically in JS)
[6672] Fix | Delete
* then consider a missing (undefined) value in the activeConstructs to
[6673] Fix | Delete
* mean it should be deactivated (since it is gone). But if it is
[6674] Fix | Delete
* dynamically created then only toggle activation if the value is defined,
[6675] Fix | Delete
* as this means that the construct was also then correspondingly
[6676] Fix | Delete
* created statically in PHP and the active callback is available.
[6677] Fix | Delete
* Otherwise, dynamically-created constructs should normally have
[6678] Fix | Delete
* their active states toggled in JS rather than from PHP.
[6679] Fix | Delete
*/
[6680] Fix | Delete
if ( ! isDynamicallyCreated || ! _.isUndefined( activeConstructs[ id ] ) ) {
[6681] Fix | Delete
if ( activeConstructs[ id ] ) {
[6682] Fix | Delete
construct.activate();
[6683] Fix | Delete
} else {
[6684] Fix | Delete
construct.deactivate();
[6685] Fix | Delete
}
[6686] Fix | Delete
}
[6687] Fix | Delete
} );
[6688] Fix | Delete
} );
[6689] Fix | Delete
[6690] Fix | Delete
if ( data.settingValidities ) {
[6691] Fix | Delete
api._handleSettingValidities( {
[6692] Fix | Delete
settingValidities: data.settingValidities,
[6693] Fix | Delete
focusInvalidControl: false
[6694] Fix | Delete
} );
[6695] Fix | Delete
}
[6696] Fix | Delete
},
[6697] Fix | Delete
[6698] Fix | Delete
/**
[6699] Fix | Delete
* Keep the preview alive by listening for ready and keep-alive messages.
[6700] Fix | Delete
*
[6701] Fix | Delete
* If a message is not received in the allotted time then the iframe will be set back to the last known valid URL.
[6702] Fix | Delete
*
[6703] Fix | Delete
* @since 4.7.0
[6704] Fix | Delete
* @access public
[6705] Fix | Delete
*
[6706] Fix | Delete
* @return {void}
[6707] Fix | Delete
*/
[6708] Fix | Delete
keepPreviewAlive: function keepPreviewAlive() {
[6709] Fix | Delete
var previewer = this, keepAliveTick, timeoutId, handleMissingKeepAlive, scheduleKeepAliveCheck;
[6710] Fix | Delete
[6711] Fix | Delete
/**
[6712] Fix | Delete
* Schedule a preview keep-alive check.
[6713] Fix | Delete
*
[6714] Fix | Delete
* Note that if a page load takes longer than keepAliveCheck milliseconds,
[6715] Fix | Delete
* the keep-alive messages will still be getting sent from the previous
[6716] Fix | Delete
* URL.
[6717] Fix | Delete
*/
[6718] Fix | Delete
scheduleKeepAliveCheck = function() {
[6719] Fix | Delete
timeoutId = setTimeout( handleMissingKeepAlive, api.settings.timeouts.keepAliveCheck );
[6720] Fix | Delete
};
[6721] Fix | Delete
[6722] Fix | Delete
/**
[6723] Fix | Delete
* Set the previewerAlive state to true when receiving a message from the preview.
[6724] Fix | Delete
*/
[6725] Fix | Delete
keepAliveTick = function() {
[6726] Fix | Delete
api.state( 'previewerAlive' ).set( true );
[6727] Fix | Delete
clearTimeout( timeoutId );
[6728] Fix | Delete
scheduleKeepAliveCheck();
[6729] Fix | Delete
};
[6730] Fix | Delete
[6731] Fix | Delete
/**
[6732] Fix | Delete
* Set the previewerAlive state to false if keepAliveCheck milliseconds have transpired without a message.
[6733] Fix | Delete
*
[6734] Fix | Delete
* This is most likely to happen in the case of a connectivity error, or if the theme causes the browser
[6735] Fix | Delete
* to navigate to a non-allowed URL. Setting this state to false will force settings with a postMessage
[6736] Fix | Delete
* transport to use refresh instead, causing the preview frame also to be replaced with the current
[6737] Fix | Delete
* allowed preview URL.
[6738] Fix | Delete
*/
[6739] Fix | Delete
handleMissingKeepAlive = function() {
[6740] Fix | Delete
api.state( 'previewerAlive' ).set( false );
[6741] Fix | Delete
};
[6742] Fix | Delete
scheduleKeepAliveCheck();
[6743] Fix | Delete
[6744] Fix | Delete
previewer.bind( 'ready', keepAliveTick );
[6745] Fix | Delete
previewer.bind( 'keep-alive', keepAliveTick );
[6746] Fix | Delete
},
[6747] Fix | Delete
[6748] Fix | Delete
/**
[6749] Fix | Delete
* Query string data sent with each preview request.
[6750] Fix | Delete
*
[6751] Fix | Delete
* @abstract
[6752] Fix | Delete
*/
[6753] Fix | Delete
query: function() {},
[6754] Fix | Delete
[6755] Fix | Delete
abort: function() {
[6756] Fix | Delete
if ( this.loading ) {
[6757] Fix | Delete
this.loading.destroy();
[6758] Fix | Delete
delete this.loading;
[6759] Fix | Delete
}
[6760] Fix | Delete
},
[6761] Fix | Delete
[6762] Fix | Delete
/**
[6763] Fix | Delete
* Refresh the preview seamlessly.
[6764] Fix | Delete
*
[6765] Fix | Delete
* @since 3.4.0
[6766] Fix | Delete
* @access public
[6767] Fix | Delete
*
[6768] Fix | Delete
* @return {void}
[6769] Fix | Delete
*/
[6770] Fix | Delete
refresh: function() {
[6771] Fix | Delete
var previewer = this, onSettingChange;
[6772] Fix | Delete
[6773] Fix | Delete
// Display loading indicator.
[6774] Fix | Delete
previewer.send( 'loading-initiated' );
[6775] Fix | Delete
[6776] Fix | Delete
previewer.abort();
[6777] Fix | Delete
[6778] Fix | Delete
previewer.loading = new api.PreviewFrame({
[6779] Fix | Delete
url: previewer.url(),
[6780] Fix | Delete
previewUrl: previewer.previewUrl(),
[6781] Fix | Delete
query: previewer.query( { excludeCustomizedSaved: true } ) || {},
[6782] Fix | Delete
container: previewer.container
[6783] Fix | Delete
});
[6784] Fix | Delete
[6785] Fix | Delete
previewer.settingsModifiedWhileLoading = {};
[6786] Fix | Delete
onSettingChange = function( setting ) {
[6787] Fix | Delete
previewer.settingsModifiedWhileLoading[ setting.id ] = true;
[6788] Fix | Delete
};
[6789] Fix | Delete
api.bind( 'change', onSettingChange );
[6790] Fix | Delete
previewer.loading.always( function() {
[6791] Fix | Delete
api.unbind( 'change', onSettingChange );
[6792] Fix | Delete
} );
[6793] Fix | Delete
[6794] Fix | Delete
previewer.loading.done( function( readyData ) {
[6795] Fix | Delete
var loadingFrame = this, onceSynced;
[6796] Fix | Delete
[6797] Fix | Delete
previewer.preview = loadingFrame;
[6798] Fix | Delete
previewer.targetWindow( loadingFrame.targetWindow() );
[6799] Fix | Delete
previewer.channel( loadingFrame.channel() );
[6800] Fix | Delete
[6801] Fix | Delete
onceSynced = function() {
[6802] Fix | Delete
loadingFrame.unbind( 'synced', onceSynced );
[6803] Fix | Delete
if ( previewer._previousPreview ) {
[6804] Fix | Delete
previewer._previousPreview.destroy();
[6805] Fix | Delete
}
[6806] Fix | Delete
previewer._previousPreview = previewer.preview;
[6807] Fix | Delete
previewer.deferred.active.resolve();
[6808] Fix | Delete
delete previewer.loading;
[6809] Fix | Delete
};
[6810] Fix | Delete
loadingFrame.bind( 'synced', onceSynced );
[6811] Fix | Delete
[6812] Fix | Delete
// This event will be received directly by the previewer in normal navigation; this is only needed for seamless refresh.
[6813] Fix | Delete
previewer.trigger( 'ready', readyData );
[6814] Fix | Delete
});
[6815] Fix | Delete
[6816] Fix | Delete
previewer.loading.fail( function( reason ) {
[6817] Fix | Delete
previewer.send( 'loading-failed' );
[6818] Fix | Delete
[6819] Fix | Delete
if ( 'logged out' === reason ) {
[6820] Fix | Delete
if ( previewer.preview ) {
[6821] Fix | Delete
previewer.preview.destroy();
[6822] Fix | Delete
delete previewer.preview;
[6823] Fix | Delete
}
[6824] Fix | Delete
[6825] Fix | Delete
previewer.login().done( previewer.refresh );
[6826] Fix | Delete
}
[6827] Fix | Delete
[6828] Fix | Delete
if ( 'cheatin' === reason ) {
[6829] Fix | Delete
previewer.cheatin();
[6830] Fix | Delete
}
[6831] Fix | Delete
});
[6832] Fix | Delete
},
[6833] Fix | Delete
[6834] Fix | Delete
login: function() {
[6835] Fix | Delete
var previewer = this,
[6836] Fix | Delete
deferred, messenger, iframe;
[6837] Fix | Delete
[6838] Fix | Delete
if ( this._login ) {
[6839] Fix | Delete
return this._login;
[6840] Fix | Delete
}
[6841] Fix | Delete
[6842] Fix | Delete
deferred = $.Deferred();
[6843] Fix | Delete
this._login = deferred.promise();
[6844] Fix | Delete
[6845] Fix | Delete
messenger = new api.Messenger({
[6846] Fix | Delete
channel: 'login',
[6847] Fix | Delete
url: api.settings.url.login
[6848] Fix | Delete
});
[6849] Fix | Delete
[6850] Fix | Delete
iframe = $( '<iframe />', { 'src': api.settings.url.login, 'title': api.l10n.loginIframeTitle } ).appendTo( this.container );
[6851] Fix | Delete
[6852] Fix | Delete
messenger.targetWindow( iframe[0].contentWindow );
[6853] Fix | Delete
[6854] Fix | Delete
messenger.bind( 'login', function () {
[6855] Fix | Delete
var refreshNonces = previewer.refreshNonces();
[6856] Fix | Delete
[6857] Fix | Delete
refreshNonces.always( function() {
[6858] Fix | Delete
iframe.remove();
[6859] Fix | Delete
messenger.destroy();
[6860] Fix | Delete
delete previewer._login;
[6861] Fix | Delete
});
[6862] Fix | Delete
[6863] Fix | Delete
refreshNonces.done( function() {
[6864] Fix | Delete
deferred.resolve();
[6865] Fix | Delete
});
[6866] Fix | Delete
[6867] Fix | Delete
refreshNonces.fail( function() {
[6868] Fix | Delete
previewer.cheatin();
[6869] Fix | Delete
deferred.reject();
[6870] Fix | Delete
});
[6871] Fix | Delete
});
[6872] Fix | Delete
[6873] Fix | Delete
return this._login;
[6874] Fix | Delete
},
[6875] Fix | Delete
[6876] Fix | Delete
cheatin: function() {
[6877] Fix | Delete
$( document.body ).empty().addClass( 'cheatin' ).append(
[6878] Fix | Delete
'<h1>' + api.l10n.notAllowedHeading + '</h1>' +
[6879] Fix | Delete
'<p>' + api.l10n.notAllowed + '</p>'
[6880] Fix | Delete
);
[6881] Fix | Delete
},
[6882] Fix | Delete
[6883] Fix | Delete
refreshNonces: function() {
[6884] Fix | Delete
var request, deferred = $.Deferred();
[6885] Fix | Delete
[6886] Fix | Delete
deferred.promise();
[6887] Fix | Delete
[6888] Fix | Delete
request = wp.ajax.post( 'customize_refresh_nonces', {
[6889] Fix | Delete
wp_customize: 'on',
[6890] Fix | Delete
customize_theme: api.settings.theme.stylesheet
[6891] Fix | Delete
});
[6892] Fix | Delete
[6893] Fix | Delete
request.done( function( response ) {
[6894] Fix | Delete
api.trigger( 'nonce-refresh', response );
[6895] Fix | Delete
deferred.resolve();
[6896] Fix | Delete
});
[6897] Fix | Delete
[6898] Fix | Delete
request.fail( function() {
[6899] Fix | Delete
deferred.reject();
[6900] Fix | Delete
});
[6901] Fix | Delete
[6902] Fix | Delete
return deferred;
[6903] Fix | Delete
}
[6904] Fix | Delete
});
[6905] Fix | Delete
[6906] Fix | Delete
api.settingConstructor = {};
[6907] Fix | Delete
api.controlConstructor = {
[6908] Fix | Delete
color: api.ColorControl,
[6909] Fix | Delete
media: api.MediaControl,
[6910] Fix | Delete
upload: api.UploadControl,
[6911] Fix | Delete
image: api.ImageControl,
[6912] Fix | Delete
cropped_image: api.CroppedImageControl,
[6913] Fix | Delete
site_icon: api.SiteIconControl,
[6914] Fix | Delete
header: api.HeaderControl,
[6915] Fix | Delete
background: api.BackgroundControl,
[6916] Fix | Delete
background_position: api.BackgroundPositionControl,
[6917] Fix | Delete
theme: api.ThemeControl,
[6918] Fix | Delete
date_time: api.DateTimeControl,
[6919] Fix | Delete
code_editor: api.CodeEditorControl
[6920] Fix | Delete
};
[6921] Fix | Delete
api.panelConstructor = {
[6922] Fix | Delete
themes: api.ThemesPanel
[6923] Fix | Delete
};
[6924] Fix | Delete
api.sectionConstructor = {
[6925] Fix | Delete
themes: api.ThemesSection,
[6926] Fix | Delete
outer: api.OuterSection
[6927] Fix | Delete
};
[6928] Fix | Delete
[6929] Fix | Delete
/**
[6930] Fix | Delete
* Handle setting_validities in an error response for the customize-save request.
[6931] Fix | Delete
*
[6932] Fix | Delete
* Add notifications to the settings and focus on the first control that has an invalid setting.
[6933] Fix | Delete
*
[6934] Fix | Delete
* @alias wp.customize._handleSettingValidities
[6935] Fix | Delete
*
[6936] Fix | Delete
* @since 4.6.0
[6937] Fix | Delete
* @private
[6938] Fix | Delete
*
[6939] Fix | Delete
* @param {Object} args
[6940] Fix | Delete
* @param {Object} args.settingValidities
[6941] Fix | Delete
* @param {boolean} [args.focusInvalidControl=false]
[6942] Fix | Delete
* @return {void}
[6943] Fix | Delete
*/
[6944] Fix | Delete
api._handleSettingValidities = function handleSettingValidities( args ) {
[6945] Fix | Delete
var invalidSettingControls, invalidSettings = [], wasFocused = false;
[6946] Fix | Delete
[6947] Fix | Delete
// Find the controls that correspond to each invalid setting.
[6948] Fix | Delete
_.each( args.settingValidities, function( validity, settingId ) {
[6949] Fix | Delete
var setting = api( settingId );
[6950] Fix | Delete
if ( setting ) {
[6951] Fix | Delete
[6952] Fix | Delete
// Add notifications for invalidities.
[6953] Fix | Delete
if ( _.isObject( validity ) ) {
[6954] Fix | Delete
_.each( validity, function( params, code ) {
[6955] Fix | Delete
var notification, existingNotification, needsReplacement = false;
[6956] Fix | Delete
notification = new api.Notification( code, _.extend( { fromServer: true }, params ) );
[6957] Fix | Delete
[6958] Fix | Delete
// Remove existing notification if already exists for code but differs in parameters.
[6959] Fix | Delete
existingNotification = setting.notifications( notification.code );
[6960] Fix | Delete
if ( existingNotification ) {
[6961] Fix | Delete
needsReplacement = notification.type !== existingNotification.type || notification.message !== existingNotification.message || ! _.isEqual( notification.data, existingNotification.data );
[6962] Fix | Delete
}
[6963] Fix | Delete
if ( needsReplacement ) {
[6964] Fix | Delete
setting.notifications.remove( code );
[6965] Fix | Delete
}
[6966] Fix | Delete
[6967] Fix | Delete
if ( ! setting.notifications.has( notification.code ) ) {
[6968] Fix | Delete
setting.notifications.add( notification );
[6969] Fix | Delete
}
[6970] Fix | Delete
invalidSettings.push( setting.id );
[6971] Fix | Delete
} );
[6972] Fix | Delete
}
[6973] Fix | Delete
[6974] Fix | Delete
// Remove notification errors that are no longer valid.
[6975] Fix | Delete
setting.notifications.each( function( notification ) {
[6976] Fix | Delete
if ( notification.fromServer && 'error' === notification.type && ( true === validity || ! validity[ notification.code ] ) ) {
[6977] Fix | Delete
setting.notifications.remove( notification.code );
[6978] Fix | Delete
}
[6979] Fix | Delete
} );
[6980] Fix | Delete
}
[6981] Fix | Delete
} );
[6982] Fix | Delete
[6983] Fix | Delete
if ( args.focusInvalidControl ) {
[6984] Fix | Delete
invalidSettingControls = api.findControlsForSettings( invalidSettings );
[6985] Fix | Delete
[6986] Fix | Delete
// Focus on the first control that is inside of an expanded section (one that is visible).
[6987] Fix | Delete
_( _.values( invalidSettingControls ) ).find( function( controls ) {
[6988] Fix | Delete
return _( controls ).find( function( control ) {
[6989] Fix | Delete
var isExpanded = control.section() && api.section.has( control.section() ) && api.section( control.section() ).expanded();
[6990] Fix | Delete
if ( isExpanded && control.expanded ) {
[6991] Fix | Delete
isExpanded = control.expanded();
[6992] Fix | Delete
}
[6993] Fix | Delete
if ( isExpanded ) {
[6994] Fix | Delete
control.focus();
[6995] Fix | Delete
wasFocused = true;
[6996] Fix | Delete
}
[6997] Fix | Delete
return wasFocused;
[6998] Fix | Delete
} );
[6999] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function