diff --git a/core/modules/node/node.preview.js b/core/modules/node/node.preview.js index 9041f24..33383a3 100644 --- a/core/modules/node/node.preview.js +++ b/core/modules/node/node.preview.js @@ -8,11 +8,36 @@ */ Drupal.behaviors.nodePreviewDestroyLinks = { attach: function (context) { + + function clickPreviewModal(event) { + // Only confirm leaving previews when left-clicking and user is not + // pressing the ALT, CTRL, META (Command key on the Macintosh keyboard) + // or SHIFT key. + if (event.button === 0 && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) { + event.preventDefault(); + var $previewDialog = $('' + Drupal.theme('nodePreviewModal') + '').appendTo('body'); + Drupal.dialog($previewDialog, { + title: Drupal.t('Leave preview?'), + buttons: [ + { + text: Drupal.t('Cancel'), + click: function () { + $(this).dialog('close'); + } + }, { + text: Drupal.t('Leave preview'), + click: function () { + window.top.location.href = event.target.href; + } + } + ] + }).showModal(); + } + } + var $preview = $(context).find('.page-node-preview').once('node-preview'); if ($preview.length) { - $preview.on('click.preview', 'a:not([href^=#], #edit-backlink, #toolbar-administration a)', function (e) { - e.preventDefault(); - }); + $preview.on('click.preview', 'a:not([href^=#], #edit-backlink, #toolbar-administration a)', clickPreviewModal); } }, detach: function (context, settings, trigger) { @@ -32,11 +57,18 @@ attach: function (context) { var $autosubmit = $(context).find('[data-drupal-autosubmit]').once('autosubmit'); if ($autosubmit.length) { - $autosubmit.on('formUpdated.preview', function() { + $autosubmit.on('formUpdated.preview', function () { $(this.form).trigger('submit'); }); } } }; + Drupal.theme.nodePreviewModal = function () { + return '

' + + Drupal.t('Leaving the preview will cause unsaved changes to be lost. Are you sure you want to leave the preview?') + + '

' + + Drupal.t('CTRL+Left click will prevent this dialog from showing and proceed to the clicked link.') + ''; + }; + })(jQuery, Drupal);