diff -r c7c34916027a -r 177826044cd9 wp/wp-admin/js/dashboard.js --- a/wp/wp-admin/js/dashboard.js Mon Oct 14 18:06:33 2019 +0200 +++ b/wp/wp-admin/js/dashboard.js Mon Oct 14 18:28:13 2019 +0200 @@ -1,12 +1,30 @@ -/* global pagenow, ajaxurl, postboxes, wpActiveEditor:true */ -var ajaxWidgets, ajaxPopulateWidgets, quickPressLoad; +/** + * @output wp-admin/js/dashboard.js + */ + +/* global pagenow, ajaxurl, postboxes, wpActiveEditor:true, ajaxWidgets */ +/* global ajaxPopulateWidgets, quickPressLoad, */ window.wp = window.wp || {}; +/** + * Initializes the dashboard widget functionality. + * + * @since 2.7.0 + */ jQuery(document).ready( function($) { var welcomePanel = $( '#welcome-panel' ), welcomePanelHide = $('#wp_welcome_panel-hide'), updateWelcomePanel; + /** + * Saves the visibility of the welcome panel. + * + * @since 3.3.0 + * + * @param {boolean} visible Should it be visible or not. + * + * @returns {void} + */ updateWelcomePanel = function( visible ) { $.post( ajaxurl, { action: 'update-welcome-panel', @@ -15,10 +33,12 @@ }); }; + // Unhide the welcome panel if the Welcome Option checkbox is checked. if ( welcomePanel.hasClass('hidden') && welcomePanelHide.prop('checked') ) { welcomePanel.removeClass('hidden'); } + // Hide the welcome panel when the dismiss button or close button is clicked. $('.welcome-panel-close, .welcome-panel-dismiss a', welcomePanel).click( function(e) { e.preventDefault(); welcomePanel.addClass('hidden'); @@ -26,64 +46,52 @@ $('#wp_welcome_panel-hide').prop('checked', false); }); + // Set welcome panel visibility based on Welcome Option checkbox value. welcomePanelHide.click( function() { welcomePanel.toggleClass('hidden', ! this.checked ); updateWelcomePanel( this.checked ? 1 : 0 ); }); - var tryGutenbergPanel = $( '#try-gutenberg-panel' ), - tryGutenbergPanelHide = $('#wp_try_gutenberg_panel-hide'), - updateTryGutenbergPanel, installGutenbergSuccess; - - updateTryGutenbergPanel = function( visible ) { - $.post( ajaxurl, { - action: 'update-try-gutenberg-panel', - visible: visible, - trygutenbergpanelnonce: $( '#trygutenbergpanelnonce' ).val() - }); - }; - - installGutenbergSuccess = function( response ) { - response.activateUrl += '&from=try-gutenberg'; - response.activateLabel = wp.updates.l10n.activatePluginLabel.replace( '%s', response.pluginName ); - wp.updates.installPluginSuccess( response ); - }; - - if ( tryGutenbergPanel.hasClass( 'hidden' ) && tryGutenbergPanelHide.prop( 'checked' ) ) { - tryGutenbergPanel.removeClass( 'hidden' ); - } + /** + * These widgets can be populated via ajax. + * + * @since 2.7.0 + * + * @type {string[]} + * + * @global + */ + window.ajaxWidgets = ['dashboard_primary']; - $( '.try-gutenberg-panel-close, .try-gutenberg-panel-dismiss a', tryGutenbergPanel ).click( function( e ) { - e.preventDefault(); - tryGutenbergPanel.addClass( 'hidden' ); - updateTryGutenbergPanel( 0 ); - $('#wp_try_gutenberg_panel-hide').prop( 'checked', false ); - }); - - tryGutenbergPanelHide.click( function() { - tryGutenbergPanel.toggleClass( 'hidden', ! this.checked ); - updateTryGutenbergPanel( this.checked ? 1 : 0 ); - }); - - tryGutenbergPanel.on( 'click', '.install-now', function( e ) { - e.preventDefault(); - var args = { - slug: $( e.target ).data( 'slug' ), - success: installGutenbergSuccess - }; - wp.updates.installPlugin( args ); - } ); - - // These widgets are sometimes populated via ajax - ajaxWidgets = ['dashboard_primary']; - - ajaxPopulateWidgets = function(el) { + /** + * Triggers widget updates via AJAX. + * + * @since 2.7.0 + * + * @global + * + * @param {string} el Optional. Widget to fetch or none to update all. + * + * @returns {void} + */ + window.ajaxPopulateWidgets = function(el) { + /** + * Fetch the latest representation of the widget via Ajax and show it. + * + * @param {number} i Number of half-seconds to use as the timeout. + * @param {string} id ID of the element which is going to be checked for changes. + * + * @returns {void} + */ function show(i, id) { var p, e = $('#' + id + ' div.inside:visible').find('.widget-loading'); + // If the element is found in the dom, queue to load latest representation. if ( e.length ) { p = e.parent(); setTimeout( function(){ + // Request the widget content. p.load( ajaxurl + '?action=dashboard-widgets&widget=' + id + '&pagenow=' + pagenow, '', function() { + // Hide the parent and slide it out for visual fancyness. p.hide().slideDown('normal', function(){ $(this).css('display', ''); }); @@ -92,39 +100,67 @@ } } + // If we have received a specific element to fetch, check if it is valid. if ( el ) { el = el.toString(); + // If the element is available as AJAX widget, show it. if ( $.inArray(el, ajaxWidgets) !== -1 ) { + // Show element without any delay. show(0, el); } } else { + // Walk through all ajaxWidgets, loading them after each other. $.each( ajaxWidgets, show ); } }; + + // Initially populate ajax widgets. ajaxPopulateWidgets(); + // Register ajax widgets as postbox toggles. postboxes.add_postbox_toggles(pagenow, { pbshow: ajaxPopulateWidgets } ); - /* QuickPress */ - quickPressLoad = function() { + /** + * Control the Quick Press (Quick Draft) widget. + * + * @since 2.7.0 + * + * @global + * + * @returns {void} + */ + window.quickPressLoad = function() { var act = $('#quickpost-action'), t; + // Enable the submit buttons. $( '#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]' ).prop( 'disabled' , false ); t = $('#quick-press').submit( function( e ) { e.preventDefault(); + + // Show a spinner. $('#dashboard_quick_press #publishing-action .spinner').show(); + + // Disable the submit button to prevent duplicate submissions. $('#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]').prop('disabled', true); + // Post the entered data to save it. $.post( t.attr( 'action' ), t.serializeArray(), function( data ) { // Replace the form, and prepend the published post. $('#dashboard_quick_press .inside').html( data ); $('#quick-press').removeClass('initial-form'); quickPressLoad(); highlightLatestPost(); + + // Focus the title to allow for quickly drafting another post. $('#title').focus(); }); + /** + * Highlights the latest post for one second. + * + * @returns {void} + */ function highlightLatestPost () { var latestPost = $('.drafts ul li').first(); latestPost.css('background', '#fffbe5'); @@ -134,42 +170,29 @@ } } ); + // Change the QuickPost action to the publish value. $('#publish').click( function() { act.val( 'post-quickpress-publish' ); } ); - $('#title, #tags-input, #content').each( function() { - var input = $(this), prompt = $('#' + this.id + '-prompt-text'); - - if ( '' === this.value ) { - prompt.removeClass('screen-reader-text'); - } - - prompt.click( function() { - $(this).addClass('screen-reader-text'); - input.focus(); - }); - - input.blur( function() { - if ( '' === this.value ) { - prompt.removeClass('screen-reader-text'); - } - }); - - input.focus( function() { - prompt.addClass('screen-reader-text'); - }); - }); - $('#quick-press').on( 'click focusin', function() { wpActiveEditor = 'content'; }); autoResizeTextarea(); }; - quickPressLoad(); + window.quickPressLoad(); + // Enable the dragging functionality of the widgets. $( '.meta-box-sortables' ).sortable( 'option', 'containment', '#wpwrap' ); + /** + * Adjust the height of the textarea based on the content. + * + * @since 3.6.0 + * + * @returns {void} + */ function autoResizeTextarea() { + // When IE8 or older is used to render this document, exit. if ( document.documentMode && document.documentMode < 9 ) { return; } @@ -180,12 +203,16 @@ var clone = $('.quick-draft-textarea-clone'), editor = $('#content'), editorHeight = editor.height(), - // 100px roughly accounts for browser chrome and allows the - // save draft button to show on-screen at the same time. + /* + * 100px roughly accounts for browser chrome and allows the + * save draft button to show on-screen at the same time. + */ editorMaxHeight = $(window).height() - 100; - // Match up textarea and clone div as much as possible. - // Padding cannot be reliably retrieved using shorthand in all browsers. + /* + * Match up textarea and clone div as much as possible. + * Padding cannot be reliably retrieved using shorthand in all browsers. + */ clone.css({ 'font-family': editor.css('font-family'), 'font-size': editor.css('font-size'), @@ -199,31 +226,34 @@ 'display': 'none' }); - // propertychange is for IE < 9 + // The 'propertychange' is used in IE < 9. editor.on('focus input propertychange', function() { var $this = $(this), - //   is to ensure that the height of a final trailing newline is included. + // Add a non-breaking space to ensure that the height of a trailing newline is + // included. textareaContent = $this.val() + ' ', - // 2px is for border-top & border-bottom + // Add 2px to compensate for border-top & border-bottom. cloneHeight = clone.css('width', $this.css('width')).text(textareaContent).outerHeight() + 2; - // Default to having scrollbars + // Default to show a vertical scrollbar, if needed. editor.css('overflow-y', 'auto'); - // Only change the height if it has indeed changed and both heights are below the max. + // Only change the height if it has changed and both heights are below the max. if ( cloneHeight === editorHeight || ( cloneHeight >= editorMaxHeight && editorHeight >= editorMaxHeight ) ) { return; } - // Don't allow editor to exceed height of window. - // This is also bound in CSS to a max-height of 1300px to be extra safe. + /* + * Don't allow editor to exceed the height of the window. + * This is also bound in CSS to a max-height of 1300px to be extra safe. + */ if ( cloneHeight > editorMaxHeight ) { editorHeight = editorMaxHeight; } else { editorHeight = cloneHeight; } - // No scrollbars as we change height, not for IE < 9 + // Disable scrollbars because we adjust the height to the content. editor.css('overflow', 'hidden'); $this.css('height', editorHeight + 'px'); @@ -238,7 +268,15 @@ var communityEventsData = window.communityEventsData || {}, app; - app = window.wp.communityEvents = { + /** + * Global Community Events namespace. + * + * @since 4.8.0 + * + * @memberOf wp + * @namespace wp.communityEvents + */ + app = window.wp.communityEvents = /** @lends wp.communityEvents */{ initialized: false, model: null, @@ -246,6 +284,8 @@ * Initializes the wp.communityEvents object. * * @since 4.8.0 + * + * @returns {void} */ init: function() { if ( app.initialized ) { @@ -276,6 +316,11 @@ $container.on( 'click', '.community-events-toggle-location, .community-events-cancel', app.toggleLocationForm ); + /** + * Filters events based on entered location. + * + * @returns {void} + */ $container.on( 'submit', '.community-events-form', function( event ) { var location = $.trim( $( '#community-events-location' ).val() ); @@ -310,6 +355,8 @@ * * @param {event|string} action 'show' or 'hide' to specify a state; * or an event object to flip between states. + * + * @returns {void} */ toggleLocationForm: function( action ) { var $toggleButton = $( '.community-events-toggle-location' ), @@ -352,7 +399,9 @@ * * @since 4.8.0 * - * @param {object} requestParams + * @param {Object} requestParams REST API Request parameters object. + * + * @returns {void} */ getEvents: function( requestParams ) { var initiatedBy, @@ -405,6 +454,8 @@ * @param {Object} templateParams The various parameters that will get passed to wp.template. * @param {string} initiatedBy 'user' to indicate that this was triggered manually by the user; * 'app' to indicate it was triggered automatically by the app itself. + * + * @returns {void} */ renderEventsTemplate: function( templateParams, initiatedBy ) { var template,