diff options
Diffstat (limited to 'plugins/jetpack/modules/masterbar/admin-menu/admin-menu.js')
-rw-r--r-- | plugins/jetpack/modules/masterbar/admin-menu/admin-menu.js | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/masterbar/admin-menu/admin-menu.js b/plugins/jetpack/modules/masterbar/admin-menu/admin-menu.js new file mode 100644 index 00000000..ce385913 --- /dev/null +++ b/plugins/jetpack/modules/masterbar/admin-menu/admin-menu.js @@ -0,0 +1,124 @@ +/* global ajaxurl, jetpackAdminMenu */ + +( function () { + function init() { + var adminbar = document.querySelector( '#wpadminbar' ); + var wpwrap = document.querySelector( '#wpwrap' ); + var adminMenu = document.querySelector( '#adminmenu' ); + + if ( ! adminbar ) { + return; + } + + function setAriaExpanded( value ) { + var anchors = adminbar.querySelectorAll( '#wp-admin-bar-blog a' ); + for ( var i = 0; i < anchors.length; i++ ) { + anchors[ i ].setAttribute( 'aria-expanded', value ); + } + } + + setFocusOnActiveMenuItem(); + setAriaExpanded( 'false' ); + + var adminbarBlog = adminbar.querySelector( '#wp-admin-bar-blog' ); + // Toggle sidebar when toggle is clicked. + if ( adminbarBlog ) { + adminbarBlog.addEventListener( 'click', function ( event ) { + event.preventDefault(); + + // Close any open toolbar submenus. + var hovers = adminbar.querySelectorAll( '.hover' ); + for ( var i = 0; i < hovers.length; i++ ) { + hovers[ i ].classList.remove( 'hover' ); + } + + wpwrap.classList.toggle( 'wp-responsive-open' ); + if ( wpwrap.classList.contains( 'wp-responsive-open' ) ) { + setAriaExpanded( 'true' ); + var first = document.querySelector( '#adminmenu a' ); + if ( first ) { + first.focus(); + } + } else { + setAriaExpanded( 'false' ); + } + } ); + } + + if ( adminMenu ) { + var collapseButton = adminMenu.querySelector( '#collapse-button' ); + // Nav-Unification feature: + // Saves the sidebar state in server when "Collapse menu" is clicked. + // This is needed so that we update WPCOM for this preference in real-time. + if ( collapseButton ) { + collapseButton.addEventListener( 'click', function ( event ) { + // Let's the core event listener be triggered first. + setTimeout( function () { + saveSidebarIsExpanded( event.target.parentNode.ariaExpanded ); + }, 50 ); + } ); + } + + const jitmDismissButton = adminMenu.querySelector( '.dismissible-card__close-icon' ); + if ( jitmDismissButton ) { + jitmDismissButton.addEventListener( 'click', function ( event ) { + event.preventDefault(); + + const siteNotice = document.getElementById( 'toplevel_page_site-notices' ); + if ( siteNotice ) { + siteNotice.style.display = 'none'; + } + + makeAjaxRequest( + 'POST', + ajaxurl, + 'application/x-www-form-urlencoded; charset=UTF-8', + 'id=' + + encodeURIComponent( jitmDismissButton.dataset.feature_id ) + + '&feature_class=' + + encodeURIComponent( jitmDismissButton.dataset.feature_class ) + + '&action=jitm_dismiss' + + '&_ajax_nonce=' + + jetpackAdminMenu.jitmDismissNonce + ); + } ); + } + } + } + + function makeAjaxRequest( method, url, contentType, body ) { + var xhr = new XMLHttpRequest(); + xhr.open( method, url, true ); + xhr.setRequestHeader( 'X-Requested-With', 'XMLHttpRequest' ); + if ( contentType ) { + xhr.setRequestHeader( 'Content-Type', contentType ); + } + xhr.withCredentials = true; + xhr.send( body ); + } + + function saveSidebarIsExpanded( expanded ) { + makeAjaxRequest( + 'POST', + ajaxurl, + 'application/x-www-form-urlencoded; charset=UTF-8', + 'action=sidebar_state&expanded=' + expanded + ); + } + + function setFocusOnActiveMenuItem() { + var currentMenuItem = document.querySelector( '.wp-submenu .current > a' ); + + if ( ! currentMenuItem ) { + return; + } + + currentMenuItem.focus(); + } + + if ( document.readyState === 'loading' ) { + document.addEventListener( 'DOMContentLoaded', init ); + } else { + init(); + } +} )(); |