MediaWiki:Common.js: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| Line 109: | Line 109: | ||
}() ); | }() ); | ||
function openCreateDialog() { | function openCreateDialog() { | ||
| Line 137: | Line 116: | ||
overlay.innerHTML = ` | overlay.innerHTML = ` | ||
<div class="grantha-modal-box"> | <div class="grantha-modal-box"> | ||
<div class="gm-title">Create | |||
<input type="text" id="gm-input" placeholder=" | <div class="gm-header"> | ||
<div class="gm-title">New document</div> | |||
<div class="gm-sub">Create a new text</div> | |||
</div> | |||
<input | |||
type="text" | |||
id="gm-input" | |||
placeholder="Untitled document" | |||
autofocus | |||
/> | |||
<div class="gm-actions"> | <div class="gm-actions"> | ||
<button | <button class="gm-btn gm-cancel">Cancel</button> | ||
<button | <button class="gm-btn gm-create">Create</button> | ||
</div> | </div> | ||
</div> | </div> | ||
`; | `; | ||
| Line 148: | Line 139: | ||
document.body.appendChild(overlay); | document.body.appendChild(overlay); | ||
var input = overlay.querySelector('#gm-input'); | |||
input.focus(); | |||
// Cancel | |||
overlay.querySelector('.gm-cancel').onclick = function () { | |||
overlay.remove(); | overlay.remove(); | ||
}; | }; | ||
// Create | |||
var name = | overlay.querySelector('.gm-create').onclick = function () { | ||
var name = input.value.trim(); | |||
if (!name) return; | if (!name) return; | ||
| Line 159: | Line 155: | ||
window.location.href = mw.util.getUrl(name, { action: 'edit' }); | window.location.href = mw.util.getUrl(name, { action: 'edit' }); | ||
}; | |||
// Enter key support | |||
input.addEventListener('keydown', function (e) { | |||
if (e.key === 'Enter') { | |||
overlay.querySelector('.gm-create').click(); | |||
} | |||
}); | |||
// Click outside to close | |||
overlay.onclick = function (e) { | |||
if (e.target === overlay) overlay.remove(); | |||
}; | }; | ||
} | } | ||
Revision as of 10:15, 6 April 2026
/* =========================
VERSE ACTIONS
========================= */
( function () {
'use strict';
/* ── Safe delegated listener ─────────────────────────────────────────── */
function onDocClick( e ) {
var target = e.target;
// Walk up to find a matching action button
function closest( el, cls ) {
while ( el && el !== document ) {
if ( el.classList && el.classList.contains( cls ) ) return el;
el = el.parentNode;
}
return null;
}
/* ── Commentary toggle ── */
var commentBtn = closest( target, 'verse-action-commentary' );
if ( commentBtn ) {
e.preventDefault();
var verseId = commentBtn.getAttribute( 'data-verse' );
if ( !verseId ) return;
// Match all commentary bodies for this verse by id prefix
var allBodies = document.querySelectorAll( '[id^="commentary-body-' + verseId + '"]' );
var allBtns = document.querySelectorAll( '.verse-action-commentary[data-verse="' + verseId + '"]' );
var isOpen = allBodies.length && allBodies[0].classList.contains( 'open' );
// Close all open commentaries on the page first
document.querySelectorAll( '.commentary-body.open' ).forEach( function ( el ) {
el.classList.remove( 'open' );
} );
document.querySelectorAll( '.verse-action-commentary.active' ).forEach( function ( el ) {
el.classList.remove( 'active' );
} );
// If it was closed, open it
if ( !isOpen ) {
allBodies.forEach( function ( el ) { el.classList.add( 'open' ); } );
allBtns.forEach( function ( el ) { el.classList.add( 'active' ); } );
}
return;
}
/* ── Copy verse — copies verse ID for crosslinking ── */
var copyBtn = closest( target, 'verse-action-copy' );
if ( copyBtn ) {
e.preventDefault();
var verseId = copyBtn.getAttribute( 'data-verse' );
if ( !verseId ) return;
copyText( verseId, copyBtn );
return;
}
/* ── Copy ID ── */
var idBtn = closest( target, 'copy-id-btn' );
if ( idBtn ) {
e.preventDefault();
var id = idBtn.getAttribute( 'data-copyid' );
if ( !id ) return;
copyText( id, idBtn );
return;
}
}
document.addEventListener( 'click', onDocClick );
/* ── Copy helper + tooltip ───────────────────────────────────────────── */
function copyText( text, btn ) {
function showTooltip() {
// Remove stale tooltip if double-clicked
var old = btn.querySelector( '.copy-tooltip' );
if ( old ) old.remove();
btn.style.position = 'relative';
var tip = document.createElement( 'span' );
tip.className = 'copy-tooltip';
tip.textContent = 'Copied ✓';
btn.appendChild( tip );
requestAnimationFrame( function () {
requestAnimationFrame( function () {
tip.classList.add( 'copy-tooltip-visible' );
} );
} );
setTimeout( function () {
tip.classList.remove( 'copy-tooltip-visible' );
setTimeout( function () { tip.remove(); }, 400 );
}, 1400 );
}
if ( navigator.clipboard && window.isSecureContext ) {
navigator.clipboard.writeText( text ).then( showTooltip );
} else {
var ta = document.createElement( 'textarea' );
ta.value = text;
ta.style.cssText = 'position:fixed;opacity:0;pointer-events:none;';
document.body.appendChild( ta );
ta.select();
document.execCommand( 'copy' );
document.body.removeChild( ta );
showTooltip();
}
}
}() );
function openCreateDialog() {
var overlay = document.createElement('div');
overlay.className = 'grantha-modal';
overlay.innerHTML = `
<div class="grantha-modal-box">
<div class="gm-header">
<div class="gm-title">New document</div>
<div class="gm-sub">Create a new text</div>
</div>
<input
type="text"
id="gm-input"
placeholder="Untitled document"
autofocus
/>
<div class="gm-actions">
<button class="gm-btn gm-cancel">Cancel</button>
<button class="gm-btn gm-create">Create</button>
</div>
</div>
`;
document.body.appendChild(overlay);
var input = overlay.querySelector('#gm-input');
input.focus();
// Cancel
overlay.querySelector('.gm-cancel').onclick = function () {
overlay.remove();
};
// Create
overlay.querySelector('.gm-create').onclick = function () {
var name = input.value.trim();
if (!name) return;
name = name.replace(/\s+/g, '_');
window.location.href = mw.util.getUrl(name, { action: 'edit' });
};
// Enter key support
input.addEventListener('keydown', function (e) {
if (e.key === 'Enter') {
overlay.querySelector('.gm-create').click();
}
});
// Click outside to close
overlay.onclick = function (e) {
if (e.target === overlay) overlay.remove();
};
}