/* eslint-disable no-jquery/no-global-selector */ $( () => { const mobileMediaQuery = window.matchMedia( 'screen and (max-width: 550px)' ), isResponsive = document.body.classList.contains( 'skin--responsive' ), echo = require( './mobile-echo.js' ), uls = require( './mobile-uls.js' ), // Toggles and targets for popouts toggles = { '#sidebar-toggle': '#sidebar-mobilejs', '#p-personal-toggle': '#p-personal', '#ca-more a': '#p-cactions', '#ca-languages a': '#p-lang', '#ca-tools a': '#p-tb' }; // Track if DOM has been set up for mobile fanciness yet let monobookMobileElements = false; // Close menus function closeMenus() { $( '.mobile-menu-active' ).removeClass( 'mobile-menu-active' ); $( '.menus-cover' ).removeClass( 'visible' ); } // Set up DOM for mobile fanciness // We don't automatically do this because MonoBook; most users will be on desktop function setupMonoBookMobile() { if ( !monobookMobileElements && mobileMediaQuery.matches ) { // Duplicate nav $( '#column-one' ).append( $( '#sidebar' ).clone().find( '*' ).addBack().each( function () { if ( this.id ) { this.id = this.id + '-mobilejs'; } } ).end().end() ); // Thing to fade out the content while menus are active $( '#column-one' ).append( $( '
' ).attr( 'id', 'menus-cover-background' ).addClass( 'menus-cover' ) ); $( '#column-one' ).append( $( '
' ).attr( 'id', 'menus-cover' ).addClass( 'menus-cover' ) ); // Add extra cactions tabs - edit, editsource, contributions // Wrap in function to keep jenkins from whining $( () => { const newTabs = [ 'ca-edit', // 'ca-ve-edit', // TODO when VE is more usable to begin with here // 'ca-watch', 'ca-unwatch', // Maybe? 't-contributions' ]; newTabs.forEach( ( item ) => { const $a = $( '#' + item + ' a' ); // TODO check if we're on the page and add class=selected if ( $a.length ) { mw.util.addPortletLink( 'p-cactions-mobile', $a.attr( 'href' ), $a.text(), $a.parent().attr( 'id' ) + '-mobile', $a.attr( 'tooltip' ), $a.attr( 'accesskey' ), '#ca-more' ); } } ); } ); // eslint-disable-next-line no-jquery/no-each-util $.each( toggles, ( toggle, target ) => { // Add close buttons $( target ).append( $( '
' ).addClass( 'mobile-close-button' ) ); // Open menus $( toggle ).on( 'click', () => { if ( mobileMediaQuery.matches ) { $( target ).addClass( 'mobile-menu-active' ); $( '.menus-cover' ).addClass( 'visible' ); } // Don't still link to # targets return false; } ); } ); $( '.mobile-close-button, .menus-cover' ).on( 'click', closeMenus ); // TODO: tap events on same (if not already included in 'click') - also close // TODO: appropriate swipe event(s) - also close monobookMobileElements = true; } } if ( isResponsive ) { $( window ).on( 'resize', setupMonoBookMobile ); setupMonoBookMobile(); if ( mw.loader.getState( 'ext.uls.interface' ) !== null ) { uls(); } if ( mw.loader.getState( 'ext.echo.init' ) !== null && !mw.user.isAnon() ) { echo(); } } } );