diff -r 3d4e9c994f10 -r a86126ab1dd4 wp/wp-admin/js/post.js --- a/wp/wp-admin/js/post.js Tue Oct 22 16:11:46 2019 +0200 +++ b/wp/wp-admin/js/post.js Tue Dec 15 13:49:49 2020 +0100 @@ -4,18 +4,19 @@ * @output wp-admin/js/post.js */ - /* global postL10n, ajaxurl, wpAjax, setPostThumbnailL10n, postboxes, pagenow, tinymce, alert, deleteUserSetting */ + /* global ajaxurl, wpAjax, postboxes, pagenow, tinymce, alert, deleteUserSetting, ClipboardJS */ /* global theList:true, theExtraList:true, getUserSetting, setUserSetting, commentReply, commentsBox */ /* global WPSetThumbnailHTML, wptitlehint */ -// Backwards compatibility: prevent fatal errors. +// Backward compatibility: prevent fatal errors. window.makeSlugeditClickable = window.editPermalink = function(){}; // Make sure the wp object exists. window.wp = window.wp || {}; ( function( $ ) { - var titleHasFocus = false; + var titleHasFocus = false, + __ = wp.i18n.__; /** * Control loading of comments on the post and term edit pages. @@ -29,13 +30,13 @@ st : 0, /** - * Fetch comments using AJAX and display them in the box. + * Fetch comments using Ajax and display them in the box. * * @memberof commentsBox * - * @param {int} total Total number of comments for this post. - * @param {int} num Optional. Number of comments to fetch, defaults to 20. - * @returns {boolean} Always returns false. + * @param {number} total Total number of comments for this post. + * @param {number} num Optional. Number of comments to fetch, defaults to 20. + * @return {boolean} Always returns false. */ get : function(total, num) { var st = this.st, data; @@ -73,11 +74,11 @@ if ( commentsBox.st > commentsBox.total ) $('#show-comments').hide(); else - $('#show-comments').show().children('a').html(postL10n.showcomm); + $('#show-comments').show().children('a').text( __( 'Show more comments' ) ); return; } else if ( 1 == r ) { - $('#show-comments').html(postL10n.endcomm); + $('#show-comments').text( __( 'No more comments found.' ) ); return; } @@ -91,9 +92,9 @@ /** * Load the next batch of comments. * - * @param {int} total Total number of comments to load. + * @memberof commentsBox * - * @memberof commentsBox + * @param {number} total Total number of comments to load. */ load: function(total){ this.st = jQuery('#the-comment-list tr.comment:visible').length; @@ -115,7 +116,7 @@ /** * Set the Image ID of the Featured Image * - * @param {int} id The post_id of the image to use as Featured Image. + * @param {number} id The post_id of the image to use as Featured Image. * * @global */ @@ -144,7 +145,7 @@ */ function(str){ if ( str == '0' ) { - alert( setPostThumbnailL10n.error ); + alert( __( 'Could not set that as the thumbnail image. Try a different attachment.' ) ); } else { WPSetThumbnailHTML(str); } @@ -200,7 +201,14 @@ } if ( received.lock_error.avatar_src ) { - avatar = $( '' ).attr( 'src', received.lock_error.avatar_src.replace( /&/g, '&' ) ); + avatar = $( '', { + 'class': 'avatar avatar-64 photo', + width: 64, + height: 64, + alt: '', + src: received.lock_error.avatar_src, + srcset: received.lock_error.avatar_src_2x ? received.lock_error.avatar_src_2x + ' 2x' : undefined + } ); wrap.find('div.post-locked-avatar').empty().append( avatar ); } @@ -288,7 +296,6 @@ */ jQuery(document).ready( function($) { var stamp, visibility, $submitButtons, updateVisibility, updateText, - sticky = '', $textarea = $('#content'), $document = $(document), postId = $('#post_ID').val() || 0, @@ -297,7 +304,10 @@ $postVisibilitySelect = $('#post-visibility-select'), $timestampdiv = $('#timestampdiv'), $postStatusSelect = $('#post-status-select'), - isMac = window.navigator.platform ? window.navigator.platform.indexOf( 'Mac' ) !== -1 : false; + isMac = window.navigator.platform ? window.navigator.platform.indexOf( 'Mac' ) !== -1 : false, + copyAttachmentURLClipboard = new ClipboardJS( '.copy-attachment-url.edit-media' ), + copyAttachmentURLSuccessTimeout, + __ = wp.i18n.__, _x = wp.i18n._x; postboxes.add_postbox_toggles(pagenow); @@ -309,24 +319,24 @@ // Post locks: contain focus inside the dialog. If the dialog is shown, focus the first item. $('#post-lock-dialog .notification-dialog').on( 'keydown', function(e) { - // Don't do anything when [tab] is pressed. + // Don't do anything when [Tab] is pressed. if ( e.which != 9 ) return; var target = $(e.target); - // [shift] + [tab] on first tab cycles back to last tab. + // [Shift] + [Tab] on first tab cycles back to last tab. if ( target.hasClass('wp-tab-first') && e.shiftKey ) { $(this).find('.wp-tab-last').focus(); e.preventDefault(); - // [tab] on last tab cycles back to first tab. + // [Tab] on last tab cycles back to first tab. } else if ( target.hasClass('wp-tab-last') && ! e.shiftKey ) { $(this).find('.wp-tab-first').focus(); e.preventDefault(); } }).filter(':visible').find('.wp-tab-first').focus(); - // Set the heartbeat interval to 15 sec. if post lock dialogs are enabled. + // Set the heartbeat interval to 15 seconds if post lock dialogs are enabled. if ( wp.heartbeat && $('#post-lock-dialog').length ) { wp.heartbeat.interval( 15 ); } @@ -385,7 +395,7 @@ }); }); - // Submit the form saving a draft or an autosave, and show a preview in a new tab + // Submit the form saving a draft or an autosave, and show a preview in a new tab. $('#post-preview').on( 'click.post-preview', function( event ) { var $this = $(this), $form = $('form#post'), @@ -465,7 +475,7 @@ $submitButtons.removeClass( 'disabled' ); } }).on( 'before-autosave.edit-post', function() { - $( '.autosave-message' ).text( postL10n.savingText ); + $( '.autosave-message' ).text( __( 'Saving Draft…' ) ); }).on( 'after-autosave.edit-post', function( event, data ) { $( '.autosave-message' ).text( data.message ); @@ -484,7 +494,7 @@ if ( ( editor && ! editor.isHidden() && editor.isDirty() ) || ( wp.autosave && wp.autosave.server.postChanged() ) ) { - return postL10n.saveAlert; + return __( 'The changes you made will be lost if you navigate away from this page.' ); } }).on( 'unload.edit-post', function( event ) { if ( ! releaseLock ) { @@ -534,7 +544,7 @@ }); }); - // Multiple Taxonomies. + // Multiple taxonomies. if ( $('#tagsdiv-post_tag').length ) { window.tagBox && window.tagBox.init(); } else { @@ -559,7 +569,7 @@ settingName = 'cats'; } - // TODO: move to jQuery 1.3+, support for multiple hierarchical taxonomies, see wp-lists.js + // @todo Move to jQuery 1.3+, support for multiple hierarchical taxonomies, see wp-lists.js. $('a', '#' + taxonomy + '-tabs').click( function( e ) { e.preventDefault(); var t = $(this).attr('href'); @@ -581,7 +591,7 @@ $( this ).val( '' ).removeClass( 'form-input-tip' ); }); - // On [enter] submit the taxonomy. + // On [Enter] submit the taxonomy. $('#new' + taxonomy).keypress( function(event){ if( 13 === event.keyCode ) { event.preventDefault(); @@ -599,7 +609,7 @@ * * @param {Object} s Taxonomy object which will be added. * - * @returns {Object} + * @return {Object} */ catAddBefore = function( s ) { if ( !$('#new'+taxonomy).val() ) { @@ -620,7 +630,7 @@ * @param {Object} r Response. * @param {Object} s Taxonomy data. * - * @returns void + * @return {void} */ catAddAfter = function( r, s ) { var sup, drop = $('#new'+taxonomy+'_parent'); @@ -654,7 +664,7 @@ $('#in-' + taxonomy + '-' + id + ', #in-popular-' + taxonomy + '-' + id).prop( 'checked', c ); }); - }); // end cats + }); // End cats. // Custom Fields postbox. if ( $('#postcustom').length ) { @@ -666,7 +676,7 @@ * * @param {Object} s Request object. * - * @returns {Object} Data modified with post_ID attached. + * @return {Object} Data modified with post_ID attached. */ addBefore: function( s ) { s.data += '&post_id=' + $('#post_ID').val(); @@ -695,7 +705,7 @@ * * @ignore * - * @returns void + * @return {void} */ updateVisibility = function() { // Show sticky for public posts. @@ -719,7 +729,7 @@ * * @ignore * - * @returns {boolean} False when an invalid timestamp has been selected, otherwise True. + * @return {boolean} False when an invalid timestamp has been selected, otherwise True. */ updateText = function() { @@ -744,14 +754,14 @@ // Determine what the publish should be depending on the date and post status. if ( attemptedDate > currentDate && $('#original_post_status').val() != 'future' ) { - publishOn = postL10n.publishOnFuture; - $('#publish').val( postL10n.schedule ); + publishOn = __( 'Schedule for:' ); + $('#publish').val( _x( 'Schedule', 'post action/button label' ) ); } else if ( attemptedDate <= currentDate && $('#original_post_status').val() != 'publish' ) { - publishOn = postL10n.publishOn; - $('#publish').val( postL10n.publish ); + publishOn = __( 'Publish on:' ); + $('#publish').val( __( 'Publish' ) ); } else { - publishOn = postL10n.publishOnPast; - $('#publish').val( postL10n.update ); + publishOn = __( 'Published on:' ); + $('#publish').val( __( 'Update' ) ); } // If the date is the same, set it to trigger update events. @@ -761,7 +771,8 @@ } else { $('#timestamp').html( '\n' + publishOn + ' ' + - postL10n.dateFormat + // translators: 1: Month, 2: Day, 3: Year, 4: Hour, 5: Minute. + __( '%1$s %2$s, %3$s at %4$s:%5$s' ) .replace( '%1$s', $( 'option[value="' + mm + '"]', '#mm' ).attr( 'data-text' ) ) .replace( '%2$s', parseInt( jj, 10 ) ) .replace( '%3$s', aa ) @@ -773,11 +784,11 @@ // Add "privately published" to post status when applies. if ( $postVisibilitySelect.find('input:radio:checked').val() == 'private' ) { - $('#publish').val( postL10n.update ); + $('#publish').val( __( 'Update' ) ); if ( 0 === optPublish.length ) { - postStatus.append(''); + postStatus.append(''); } else { - optPublish.html( postL10n.privatelyPublished ); + optPublish.html( __( 'Privately Published' ) ); } $('option[value="publish"]', postStatus).prop('selected', true); $('#misc-publishing-actions .edit-post-status').hide(); @@ -788,7 +799,7 @@ postStatus.val($('#hidden_post_status').val()); } } else { - optPublish.html( postL10n.published ); + optPublish.html( __( 'Published' ) ); } if ( postStatus.is(':hidden') ) $('#misc-publishing-actions .edit-post-status').show(); @@ -796,7 +807,8 @@ // Update "Status:" to currently selected status. $('#post-status-display').text( - wp.sanitize.stripTagsAndEncodeText( $('option:selected', postStatus).text() ) // Remove any potential tags from post status text. + // Remove any potential tags from post status text. + wp.sanitize.stripTagsAndEncodeText( $('option:selected', postStatus).text() ) ); // Show or hide the "Save Draft" button. @@ -805,9 +817,9 @@ } else { $('#save-post').show(); if ( $('option:selected', postStatus).val() == 'pending' ) { - $('#save-post').show().val( postL10n.savePending ); + $('#save-post').show().val( __( 'Save as Pending' ) ); } else { - $('#save-post').show().val( postL10n.saveDraft ); + $('#save-post').show().val( __( 'Save Draft' ) ); } } return true; @@ -838,22 +850,30 @@ }); // Set the selected visibility as current. - $postVisibilitySelect.find('.save-post-visibility').click( function( event ) { // crazyhorse - multiple ok cancels + $postVisibilitySelect.find('.save-post-visibility').click( function( event ) { // Crazyhorse - multiple OK cancels. + var visibilityLabel = '', selectedVisibility = $postVisibilitySelect.find('input:radio:checked').val(); + $postVisibilitySelect.slideUp('fast'); $('#visibility .edit-visibility').show().focus(); updateText(); - if ( $postVisibilitySelect.find('input:radio:checked').val() != 'public' ) { + if ( 'public' !== selectedVisibility ) { $('#sticky').prop('checked', false); } - if ( $('#sticky').prop('checked') ) { - sticky = 'Sticky'; - } else { - sticky = ''; + switch ( selectedVisibility ) { + case 'public': + visibilityLabel = $( '#sticky' ).prop( 'checked' ) ? __( 'Public, Sticky' ) : __( 'Public' ); + break; + case 'private': + visibilityLabel = __( 'Private' ); + break; + case 'password': + visibilityLabel = __( 'Password Protected' ); + break; } - $('#post-visibility-display').html( postL10n[ $postVisibilitySelect.find('input:radio:checked').val() + sticky ] ); + $('#post-visibility-display').text( visibilityLabel ); event.preventDefault(); }); @@ -886,7 +906,7 @@ }); // Save the changed timestamp. - $timestampdiv.find('.save-timestamp').click( function( event ) { // crazyhorse - multiple ok cancels + $timestampdiv.find('.save-timestamp').click( function( event ) { // Crazyhorse - multiple OK cancels. if ( updateText() ) { $timestampdiv.slideUp('fast'); $timestampdiv.siblings('a.edit-timestamp').show().focus(); @@ -937,11 +957,11 @@ /** * Handle the editing of the post_name. Create the required HTML elements and - * update the changes via AJAX. + * update the changes via Ajax. * * @global * - * @returns void + * @return {void} */ function editPermalink() { var i, slug_value, @@ -966,7 +986,7 @@ $el = $( '#editable-post-name' ); revert_e = $el.html(); - buttons.html( ' ' ); + buttons.html( ' ' ); // Save permalink changes. buttons.children( '.save' ).click( function() { @@ -999,7 +1019,7 @@ permalink.html(permalinkOrig); real_slug.val(new_slug); $( '.edit-slug' ).focus(); - wp.a11y.speak( postL10n.permalinkSaved ); + wp.a11y.speak( __( 'Permalink saved' ) ); } ); }); @@ -1023,12 +1043,12 @@ $el.html( '' ).children( 'input' ).keydown( function( e ) { var key = e.which; - // On [enter], just save the new slug, don't save the post. + // On [Enter], just save the new slug, don't save the post. if ( 13 === key ) { e.preventDefault(); buttons.children( '.save' ).click(); } - // On [esc] cancel the editing. + // On [Esc] cancel the editing. if ( 27 === key ) { buttons.children( '.cancel' ).click(); } @@ -1051,7 +1071,7 @@ * * @global * - * @returns void + * @return {void} */ window.wptitlehint = function( id ) { id = id || 'title'; @@ -1173,7 +1193,7 @@ } }); - // When changing page template, change the editor body class + // When changing page template, change the editor body class. $( '#page_template' ).on( 'change.set-editor-class', function() { var editor, body, pageTemplate = $( this ).val() || ''; @@ -1191,9 +1211,9 @@ } - // Save on pressing [ctrl]/[command] + [s] in the Text editor. + // Save on pressing [Ctrl]/[Command] + [S] in the Text editor. $textarea.on( 'keydown.wp-autosave', function( event ) { - // Key [s] has code 83. + // Key [S] has code 83. if ( event.which === 83 ) { if ( event.shiftKey || event.altKey || ( isMac && ( ! event.metaKey || event.ctrlKey ) ) || ( ! isMac && ! event.ctrlKey ) ) { return; @@ -1216,7 +1236,38 @@ window.history.replaceState( null, null, location ); }); } -}); + + /** + * Copies the attachment URL in the Edit Media page to the clipboard. + * + * @since 5.5.0 + * + * @param {MouseEvent} event A click event. + * + * @return {void} + */ + copyAttachmentURLClipboard.on( 'success', function( event ) { + var triggerElement = $( event.trigger ), + successElement = $( '.success', triggerElement.closest( '.copy-to-clipboard-container' ) ); + + // Clear the selection and move focus back to the trigger. + event.clearSelection(); + // Handle ClipboardJS focus bug, see https://github.com/zenorocha/clipboard.js/issues/680 + triggerElement.focus(); + + // Show success visual feedback. + clearTimeout( copyAttachmentURLSuccessTimeout ); + successElement.removeClass( 'hidden' ); + + // Hide success visual feedback after 3 seconds since last success. + copyAttachmentURLSuccessTimeout = setTimeout( function() { + successElement.addClass( 'hidden' ); + }, 3000 ); + + // Handle success audible feedback. + wp.a11y.speak( __( 'The file URL has been copied to your clipboard' ) ); + } ); +} ); /** * TinyMCE word count display