X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/0461a5f2e55c8d5f1fde96ca2e83117152573c7d..refs/tags/wordpress-4.0:/wp-admin/js/accordion.js diff --git a/wp-admin/js/accordion.js b/wp-admin/js/accordion.js index 7bc99ccc..6cb1c1ca 100644 --- a/wp-admin/js/accordion.js +++ b/wp-admin/js/accordion.js @@ -1,40 +1,86 @@ +/** + * Accordion-folding functionality. + * + * Markup with the appropriate classes will be automatically hidden, + * with one section opening at a time when its title is clicked. + * Use the following markup structure for accordion behavior: + * + *
+ *
+ *

+ *
+ *
+ *
+ *
+ *

+ *
+ *
+ *
+ *
+ *

+ *
+ *
+ *
+ *
+ * + * Note that any appropriate tags may be used, as long as the above classes are present. + * + * In addition to the standard accordion behavior, this file includes JS for the + * Customizer's "Panel" functionality. + * + * @since 3.6.0. + */ + ( function( $ ){ $( document ).ready( function () { - // Expand/Collapse on click + // Expand/Collapse accordion sections on click. $( '.accordion-container' ).on( 'click keydown', '.accordion-section-title', function( e ) { - if ( e.type === 'keydown' && 13 !== e.which ) // "return" key - return; + if ( e.type === 'keydown' && 13 !== e.which ) { // "return" key + return; + } + e.preventDefault(); // Keep this AFTER the key filter above accordionSwitch( $( this ) ); }); - // Re-initialize accordion when screen options are toggled - $( '.hide-postbox-tog' ).click( function () { - accordionInit(); - }); + // Go back to the top-level Customizer accordion. + $( '#customize-header-actions' ).on( 'click keydown', '.control-panel-back', function( e ) { + if ( e.type === 'keydown' && 13 !== e.which ) { // "return" key + return; + } - }); + e.preventDefault(); // Keep this AFTER the key filter above - var accordionOptions = $( '.accordion-container li.accordion-section' ), - sectionContent = $( '.accordion-section-content' ); + panelSwitch( $( '.current-panel' ) ); + }); + }); - function accordionInit () { - // Rounded corners - accordionOptions.removeClass( 'top bottom' ); - accordionOptions.filter( ':visible' ).first().addClass( 'top' ); - accordionOptions.filter( ':visible' ).last().addClass( 'bottom' ).find( sectionContent ).addClass( 'bottom' ); - } + var sectionContent = $( '.accordion-section-content' ); + /** + * Close the current accordion section and open a new one. + * + * @param {Object} el Title element of the accordion section to toggle. + * @since 3.6.0 + */ function accordionSwitch ( el ) { var section = el.closest( '.accordion-section' ), siblings = section.closest( '.accordion-container' ).find( '.open' ), content = section.find( sectionContent ); - if ( section.hasClass( 'cannot-expand' ) ) + // This section has no content and cannot be expanded. + if ( section.hasClass( 'cannot-expand' ) ) { + return; + } + + // Slide into a sub-panel instead of accordioning (Customizer-specific). + if ( section.hasClass( 'control-panel' ) ) { + panelSwitch( section ); return; + } if ( section.hasClass( 'open' ) ) { section.toggleClass( 'open' ); @@ -45,11 +91,53 @@ content.toggle( false ).slideToggle( 150 ); section.toggleClass( 'open' ); } - - accordionInit(); } - // Initialize the accordion (currently just corner fixes) - accordionInit(); + /** + * Slide into an accordion sub-panel. + * + * For the Customizer-specific panel functionality + * + * @param {Object} panel Title element or back button of the accordion panel to toggle. + * @since 4.0.0 + */ + function panelSwitch( panel ) { + var position, scroll, + section = panel.closest( '.accordion-section' ), + overlay = section.closest( '.wp-full-overlay' ), + container = section.closest( '.accordion-container' ), + siblings = container.find( '.open' ), + topPanel = overlay.find( '#customize-theme-controls > ul > .accordion-section > .accordion-section-title' ).add( '#customize-info > .accordion-section-title' ), + backBtn = overlay.find( '.control-panel-back' ), + panelTitle = section.find( '.accordion-section-title' ).first(), + content = section.find( '.control-panel-content' ); + + if ( section.hasClass( 'current-panel' ) ) { + section.toggleClass( 'current-panel' ); + overlay.toggleClass( 'in-sub-panel' ); + content.delay( 180 ).hide( 0, function() { + content.css( 'margin-top', 'inherit' ); // Reset + } ); + topPanel.attr( 'tabindex', '0' ); + backBtn.attr( 'tabindex', '-1' ); + panelTitle.focus(); + container.scrollTop( 0 ); + } else { + // Close all open sections in any accordion level. + siblings.removeClass( 'open' ); + siblings.find( sectionContent ).show().slideUp( 0 ); + content.show( 0, function() { + position = content.offset().top; + scroll = container.scrollTop(); + content.css( 'margin-top', ( 45 - position - scroll ) ); + section.toggleClass( 'current-panel' ); + overlay.toggleClass( 'in-sub-panel' ); + container.scrollTop( 0 ); + } ); + topPanel.attr( 'tabindex', '-1' ); + backBtn.attr( 'tabindex', '0' ); + backBtn.focus(); + } + } })(jQuery);