mirror of
https://gerrit.wikimedia.org/r/mediawiki/skins/Vector.git
synced 2024-11-29 01:45:00 +00:00
e1d1de809f
- The collapsible ToC absolute positioning solution has been preserved to be used on no-js mobile resolutions - The collapsible ToC grid based positioning solution has been removed - ToC styles have been refactored and organzied This patch involves HTML changes. In order to avoid additional complexity, this patch disables the collapsible ToC feature for users above the mobile viewport with cached HTML. The ToC continues to be automatically collapsed on mobile viewports for cached HTML users. This patch results in 9 expected visual changes. In order to see them you need to take the following steps: 1. Run `./pixel.js reference` 2. Checkout the following PR in pixel https://github.com/wikimedia/pixel/pull/149 3. Run ./pixel.js test -c 859143 It should look like this: https://jmp.sh/ZVQqDZw7 Bug: T318013 Change-Id: Iea0d73005b91589c58ae38a3a640fa90c18a860d
69 lines
2.3 KiB
JavaScript
69 lines
2.3 KiB
JavaScript
const PINNED_HEADER_CLASS = 'vector-pinnable-header-pinned';
|
|
const UNPINNED_HEADER_CLASS = 'vector-pinnable-header-unpinned';
|
|
|
|
/**
|
|
* @param {HTMLElement} header
|
|
*/
|
|
function bindPinnableToggleButtons( header ) {
|
|
const name = header.dataset.name;
|
|
if ( !name ) {
|
|
return;
|
|
}
|
|
|
|
const toggleButtons = header.querySelectorAll( '.vector-pinnable-header-toggle-button' );
|
|
const pinnableElementId = header.dataset.pinnableElementId;
|
|
const pinnedContainerId = header.dataset.pinnedContainerId;
|
|
const unpinnedContainerId = header.dataset.unpinnedContainerId;
|
|
|
|
toggleButtons.forEach( function ( button ) {
|
|
button.addEventListener( 'click', () => {
|
|
// Toggle body classes, assumes default pinned classes are initialized serverside
|
|
document.body.classList.toggle( `${name}-pinned` );
|
|
document.body.classList.toggle( `${name}-unpinned` );
|
|
|
|
// Toggle pinned class
|
|
header.classList.toggle( PINNED_HEADER_CLASS );
|
|
header.classList.toggle( UNPINNED_HEADER_CLASS );
|
|
|
|
// Optional functionality of moving the pinnable element in the DOM
|
|
// to different containers based on it's pinned status
|
|
if ( pinnableElementId && pinnedContainerId && unpinnedContainerId ) {
|
|
const pinned = document.body.classList.contains( `${name}-pinned` );
|
|
const newContainerId = pinned ? pinnedContainerId : unpinnedContainerId;
|
|
movePinnableElement( pinnableElementId, newContainerId );
|
|
}
|
|
} );
|
|
} );
|
|
}
|
|
|
|
/**
|
|
* @param {string} pinnableElementId
|
|
* @param {string} newContainerId
|
|
*/
|
|
function movePinnableElement( pinnableElementId, newContainerId ) {
|
|
const pinnableElem = document.getElementById( pinnableElementId );
|
|
const newContainer = document.getElementById( newContainerId );
|
|
const currContainer = /** @type {HTMLElement} */ ( pinnableElem && pinnableElem.parentElement );
|
|
|
|
if ( !pinnableElem || !newContainer || !currContainer ) {
|
|
return;
|
|
}
|
|
|
|
// Avoid moving element if unnecessary
|
|
if ( currContainer.id !== newContainerId ) {
|
|
newContainer.insertAdjacentElement( 'beforeend', pinnableElem );
|
|
}
|
|
}
|
|
|
|
function initPinnableElement() {
|
|
const pinnableHeader = /** @type {NodeListOf<HTMLElement>} */ ( document.querySelectorAll( '.vector-pinnable-header' ) );
|
|
pinnableHeader.forEach( bindPinnableToggleButtons );
|
|
}
|
|
|
|
module.exports = {
|
|
initPinnableElement,
|
|
movePinnableElement,
|
|
PINNED_HEADER_CLASS,
|
|
UNPINNED_HEADER_CLASS
|
|
};
|