Editor: Fix improper triggering of the "Are you sure" prompt when navigating away from the old, "classic" Edit Post screen and there are no changes. Was triggered when there is an instance of TinyMCE in the Excerpt postbox.

This brings the changes from [49807] to the 5.6 branch.

Props rodrigosprimo, jonathanstegall, kevin940726, azaozz, metalandcoffee, ifnoob.

Fixes .



git-svn-id: https://develop.svn.wordpress.org/branches/5.6@50031 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Jake Spurlock 2021-01-27 19:50:30 +00:00
parent 323c07a018
commit 4799701cd3
2 changed files with 60 additions and 10 deletions
src/js/_enqueues

@ -488,12 +488,20 @@ jQuery(document).ready( function($) {
* When the user is trying to load another page, or reloads current page
* show a confirmation dialog when there are unsaved changes.
*/
$(window).on( 'beforeunload.edit-post', function() {
var editor = typeof tinymce !== 'undefined' && tinymce.get('content');
$( window ).on( 'beforeunload.edit-post', function( event ) {
var editor = window.tinymce && window.tinymce.get( 'content' );
var changed = false;
if ( ( editor && ! editor.isHidden() && editor.isDirty() ) ||
( wp.autosave && wp.autosave.server.postChanged() ) ) {
if ( wp.autosave ) {
changed = wp.autosave.server.postChanged();
} else if ( editor ) {
changed = ( ! editor.isHidden() && editor.isDirty() );
}
if ( changed ) {
event.preventDefault();
// The return string is needed for browser compat.
// See https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event.
return __( 'The changes you made will be lost if you navigate away from this page.' );
}
}).on( 'unload.edit-post', function( event ) {

@ -36,8 +36,24 @@ window.autosave = function() {
*/
function autosave() {
var initialCompareString,
lastTriggerSave = 0,
$document = $(document);
initialCompareData = {},
lastTriggerSave = 0,
$document = $( document );
/**
* Sets the initial compare data.
*
* @since 5.6.1
*/
function setInitialCompare() {
initialCompareData = {
post_title: $( '#title' ).val() || '',
content: $( '#content' ).val() || '',
excerpt: $( '#excerpt' ).val() || ''
};
initialCompareString = getCompareString( initialCompareData );
}
/**
* Returns the data saved in both local and remote autosave.
@ -686,6 +702,32 @@ window.autosave = function() {
* @return {boolean} True if the post has been changed.
*/
function postChanged() {
var changed = false;
// If there are TinyMCE instances, loop through them.
if ( window.tinymce ) {
window.tinymce.each( [ 'content', 'excerpt' ], function( field ) {
var editor = window.tinymce.get( field );
if ( ! editor || editor.isHidden() ) {
if ( $( '#' + field ).val() !== initialCompareData[ field ] ) {
changed = true;
// Break.
return false;
}
} else if ( editor.isDirty() ) {
changed = true;
return false;
}
} );
if ( $( '#title' ).val() !== initialCompareData.post_title ) {
changed = true;
}
return changed;
}
return getCompareString() !== initialCompareString;
}
@ -832,16 +874,16 @@ window.autosave = function() {
* @return {void}
*/
$document.on( 'tinymce-editor-init.autosave', function( event, editor ) {
if ( editor.id === 'content' ) {
// Reset the initialCompare data after the TinyMCE instances have been initialized.
if ( 'content' === editor.id || 'excerpt' === editor.id ) {
window.setTimeout( function() {
editor.save();
initialCompareString = getCompareString();
setInitialCompare();
}, 1000 );
}
}).ready( function() {
// Set the initial compare string in case TinyMCE is not used or not loaded first.
initialCompareString = getCompareString();
setInitialCompare();
});
return {