MediaWiki:Common.js: Porovnání verzí
Z Franklinova expedice
asynchronně? |
Skript umožňující skrytí alertů po definovanou dobu |
||
| (Není zobrazeno 10 mezilehlých verzí od stejného uživatele.) | |||
| Řádek 1: | Řádek 1: | ||
/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky. */ | /* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky. */ | ||
/* alert(mw.toolbar); | /** | ||
* AlertDismiss (global) — keep Bootstrap 5 alerts dismissed across pages. | |||
* Works for anonymous users (localStorage). No Gadgets needed. | |||
* | |||
* Usage in your wikitext/SiteNotice: | |||
* <div id="site-alert" | |||
* class="alert alert-warning alert-dismissible fade show" | |||
* role="alert" | |||
* data-alert-ttl="86400" <!-- seconds; default 86400 (1 day) --> | |||
* data-alert-version="1"> <!-- bump to force re-show --> | |||
* <strong>Heads up:</strong> Maintenance tonight. | |||
* <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> | |||
* </div> | |||
* | |||
* Optional: ?resetalerts=1 in the URL clears stored state for alerts on that page. | |||
*/ | |||
(function (mw, $) { | |||
'use strict'; | |||
var DEFAULT_TTL_MS = 86400 * 1000; // 1 day | |||
var STORAGE_PREFIX = 'AlertDismiss/'; | |||
function now() { return Date.now(); } | |||
function keyFor(id, version) { return STORAGE_PREFIX + id + '/v' + (version || 1); } | |||
function parseIntAttr($el, name, fallback) { | |||
var v = $el.attr(name); | |||
if (!v) return fallback; | |||
var n = parseInt(v, 10); | |||
return Number.isFinite(n) ? n : fallback; | |||
} | |||
function getStableId($el) { | |||
return $el.attr('data-alert-id') || $el.attr('id') || null; | |||
} | |||
function readStore(k) { | |||
try { var r = localStorage.getItem(k); return r ? JSON.parse(r) : null; } catch (e) { return null; } | |||
} | |||
function writeStore(k, obj) { try { localStorage.setItem(k, JSON.stringify(obj)); } catch (e) {} } | |||
function removeStore(k) { try { localStorage.removeItem(k); } catch (e) {} } | |||
function isDismissed(k, ttlMs) { | |||
var d = readStore(k); | |||
return d && d.time && (now() - d.time) < ttlMs; | |||
} | |||
function bindDismiss($alert, k) { | |||
// If Bootstrap JS is present, use its event; otherwise fall back to button click. | |||
if (window.bootstrap || $.fn.alert) { | |||
$alert.on('closed.bs.alert', function () { | |||
writeStore(k, { time: now() }); | |||
}); | |||
} else { | |||
$alert.find('.btn-close').on('click', function () { | |||
writeStore(k, { time: now() }); | |||
setTimeout(function () { $alert.remove(); }, 0); | |||
}); | |||
} | |||
} | |||
function process($root) { | |||
var resetParam = mw.util && mw.util.getParamValue ? mw.util.getParamValue('resetalerts') : null; | |||
$root.find('.alert.alert-dismissible').each(function () { | |||
var $a = $(this); | |||
var id = getStableId($a); | |||
if (!id) return; // require a stable id | |||
var version = parseIntAttr($a, 'data-alert-version', 1); | |||
var ttlSec = parseIntAttr($a, 'data-alert-ttl', DEFAULT_TTL_MS / 1000); | |||
var ttlMs = ttlSec * 1000; | |||
var k = keyFor(id, version); | |||
if (resetParam === '1') removeStore(k); | |||
if (isDismissed(k, ttlMs)) { | |||
$a.remove(); // hide before user sees it | |||
return; | |||
} | |||
bindDismiss($a, k); | |||
}); | |||
} | |||
// Run on initial render and on any content refresh (previews/VE/etc.) | |||
mw.hook('wikipage.content').add(function ($content) { process($content); }); | |||
$(function () { process($(document)); }); | |||
})(mediaWiki, jQuery); | |||
/** | |||
* Extra buttons in toolbar | |||
* @stats [[File:Krinkle_InsertWikiEditorButton.js]] | |||
*/ | |||
$.ajax({ dataType: 'script', cache: true, | |||
url: 'https://meta.wikimedia.org/w/index.php?title=User:Krinkle/Scripts/InsertWikiEditorButton.js&action=raw&ctype=text/javascript' | |||
}).then(function () { | |||
// Ship | |||
krInsertWikiEditorButton({ | |||
id: "mw-customeditbutton-ship", | |||
icon: "/wiki/resources/assets/custom-icons/button-ship.png", | |||
label: 'Ship', | |||
insertBefore: '<span class="name-ship">', | |||
insertAfter: '</span>', | |||
sampleText: 'Loď' | |||
}); | |||
// Person | |||
krInsertWikiEditorButton({ | |||
id: "mw-customeditbutton-person", | |||
icon: "/wiki/resources/assets/custom-icons/button-person.png", | |||
label: 'Person', | |||
insertBefore: '<span class="name-person">', | |||
insertAfter: '</span>', | |||
sampleText: 'Osoba' | |||
}); | |||
// Place | |||
krInsertWikiEditorButton({ | |||
id: "mw-customeditbutton-place", | |||
icon: "/wiki/resources/assets/custom-icons/button-place.png", | |||
label: 'Place', | |||
insertBefore: '<span class="name-place">', | |||
insertAfter: '</span>', | |||
sampleText: 'Místo' | |||
}); | |||
// Date | |||
krInsertWikiEditorButton({ | |||
id: "mw-customeditbutton-date", | |||
icon: "/wiki/resources/assets/custom-icons/button-date.png", | |||
label: 'Date', | |||
insertBefore: '<span class="text-date">', | |||
insertAfter: '</span>', | |||
sampleText: 'Datum' | |||
}); | |||
// English (blok) | |||
krInsertWikiEditorButton({ | |||
id: "mw-customeditbutton-enblock", | |||
icon: "/wiki/resources/assets/custom-icons/button-en.png", | |||
label: 'English block', | |||
insertBefore: '<div lang="en">', | |||
insertAfter: '</div>', | |||
sampleText: 'English text' | |||
}); | |||
// Citace (blok) | |||
krInsertWikiEditorButton({ | |||
id: "mw-customeditbutton-blockquote", | |||
icon: "/wiki/resources/assets/custom-icons/button-blockquote.png", | |||
label: 'Bloková citace', | |||
insertBefore: '<blockquote>', | |||
insertAfter: '</blockquote>', | |||
sampleText: 'Citovaný odstavec' | |||
}); | |||
// Citace (inline text) | |||
krInsertWikiEditorButton({ | |||
id: "mw-customeditbutton-inlinequote", | |||
icon: "/wiki/resources/assets/custom-icons/button-quote.png", | |||
label: 'Řádková citace', | |||
insertBefore: '<q>', | |||
insertAfter: '</q>', | |||
sampleText: 'Citovaný text' | |||
}); | |||
}); | |||
/* Viz https://www.mediawiki.org/wiki/Manual:Custom_edit_buttons#Classic_edit_toolbar */ | |||
mw.hook( 'wikipage.editform' ).add( function () { | mw.hook( 'wikipage.editform' ).add( function () { | ||
mw.loader.using( 'mediawiki.toolbar' ).then( function () { | mw.loader.using( 'mediawiki.toolbar' ).then( function () { | ||
mw.toolbar.addButton( { | |||
imageFile: '/wiki/resources/assets/custom-icons/button-ship.png', | |||
speedTip: 'Loď', | |||
tagOpen: '<span class="name-ship">', | |||
tagClose: '</span>', | |||
sampleText: 'Jméno lodi', | |||
imageId: 'button-ship' | |||
} ); | |||
mw.toolbar.addButton( { | |||
imageFile: '/wiki/resources/assets/custom-icons/button-person.png', | |||
speedTip: 'Osoba', | |||
tagOpen: '<span class="name-person">', | |||
tagClose: '</span>', | |||
sampleText: 'Jméno osoby', | |||
imageId: 'button-person' | |||
} ); | |||
mw.toolbar.addButton( { | |||
imageFile: '/wiki/resources/assets/custom-icons/button-place.png', | |||
speedTip: 'Místo', | |||
tagOpen: '<span class="name-place">', | |||
tagClose: '</span>', | |||
sampleText: 'Jméno místa', | |||
imageId: 'button-place' | |||
} ); | |||
mw.toolbar.addButton( { | |||
imageFile: '/wiki/resources/assets/custom-icons/button-date.png', | |||
speedTip: 'Datum', | |||
tagOpen: '<span class="text-date">', | |||
tagClose: '</span>', | |||
sampleText: 'Datum', | |||
imageId: 'button-date' | |||
} ); | |||
mw.toolbar.addButton( { | |||
imageFile: '/wiki/resources/assets/custom-icons/button-en.png', | |||
speedTip: 'English', | |||
tagOpen: '<div lang="en">', | |||
tagClose: '</div>', | |||
sampleText: 'English text', | |||
imageId: 'button-english' | |||
} ); | |||
mw.toolbar.addButton( { | |||
imageFile: '/wiki/resources/assets/custom-icons/button-blockquote.png', | |||
speedTip: 'Bloková citace', | |||
tagOpen: '<blockquote>', | |||
tagClose: '</blockquote>', | |||
sampleText: 'Citovaný odstavec', | |||
imageId: 'button-blockquote' | |||
} ); | |||
mw.toolbar.addButton( { | |||
imageFile: '/wiki/resources/assets/custom-icons/button-quote.png', | |||
speedTip: 'Řádková citace', | |||
tagOpen: '<q>', | |||
tagClose: '</q>', | |||
sampleText: 'Citovaný text', | |||
imageId: 'button-quote' | |||
} ); | |||
} ); | } ); | ||
} ); | } ); | ||
Aktuální verze z 3. 9. 2025, 21:12
/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky. */
/**
* AlertDismiss (global) — keep Bootstrap 5 alerts dismissed across pages.
* Works for anonymous users (localStorage). No Gadgets needed.
*
* Usage in your wikitext/SiteNotice:
* <div id="site-alert"
* class="alert alert-warning alert-dismissible fade show"
* role="alert"
* data-alert-ttl="86400" <!-- seconds; default 86400 (1 day) -->
* data-alert-version="1"> <!-- bump to force re-show -->
* <strong>Heads up:</strong> Maintenance tonight.
* <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
* </div>
*
* Optional: ?resetalerts=1 in the URL clears stored state for alerts on that page.
*/
(function (mw, $) {
'use strict';
var DEFAULT_TTL_MS = 86400 * 1000; // 1 day
var STORAGE_PREFIX = 'AlertDismiss/';
function now() { return Date.now(); }
function keyFor(id, version) { return STORAGE_PREFIX + id + '/v' + (version || 1); }
function parseIntAttr($el, name, fallback) {
var v = $el.attr(name);
if (!v) return fallback;
var n = parseInt(v, 10);
return Number.isFinite(n) ? n : fallback;
}
function getStableId($el) {
return $el.attr('data-alert-id') || $el.attr('id') || null;
}
function readStore(k) {
try { var r = localStorage.getItem(k); return r ? JSON.parse(r) : null; } catch (e) { return null; }
}
function writeStore(k, obj) { try { localStorage.setItem(k, JSON.stringify(obj)); } catch (e) {} }
function removeStore(k) { try { localStorage.removeItem(k); } catch (e) {} }
function isDismissed(k, ttlMs) {
var d = readStore(k);
return d && d.time && (now() - d.time) < ttlMs;
}
function bindDismiss($alert, k) {
// If Bootstrap JS is present, use its event; otherwise fall back to button click.
if (window.bootstrap || $.fn.alert) {
$alert.on('closed.bs.alert', function () {
writeStore(k, { time: now() });
});
} else {
$alert.find('.btn-close').on('click', function () {
writeStore(k, { time: now() });
setTimeout(function () { $alert.remove(); }, 0);
});
}
}
function process($root) {
var resetParam = mw.util && mw.util.getParamValue ? mw.util.getParamValue('resetalerts') : null;
$root.find('.alert.alert-dismissible').each(function () {
var $a = $(this);
var id = getStableId($a);
if (!id) return; // require a stable id
var version = parseIntAttr($a, 'data-alert-version', 1);
var ttlSec = parseIntAttr($a, 'data-alert-ttl', DEFAULT_TTL_MS / 1000);
var ttlMs = ttlSec * 1000;
var k = keyFor(id, version);
if (resetParam === '1') removeStore(k);
if (isDismissed(k, ttlMs)) {
$a.remove(); // hide before user sees it
return;
}
bindDismiss($a, k);
});
}
// Run on initial render and on any content refresh (previews/VE/etc.)
mw.hook('wikipage.content').add(function ($content) { process($content); });
$(function () { process($(document)); });
})(mediaWiki, jQuery);
/**
* Extra buttons in toolbar
* @stats [[File:Krinkle_InsertWikiEditorButton.js]]
*/
$.ajax({ dataType: 'script', cache: true,
url: 'https://meta.wikimedia.org/w/index.php?title=User:Krinkle/Scripts/InsertWikiEditorButton.js&action=raw&ctype=text/javascript'
}).then(function () {
// Ship
krInsertWikiEditorButton({
id: "mw-customeditbutton-ship",
icon: "/wiki/resources/assets/custom-icons/button-ship.png",
label: 'Ship',
insertBefore: '<span class="name-ship">',
insertAfter: '</span>',
sampleText: 'Loď'
});
// Person
krInsertWikiEditorButton({
id: "mw-customeditbutton-person",
icon: "/wiki/resources/assets/custom-icons/button-person.png",
label: 'Person',
insertBefore: '<span class="name-person">',
insertAfter: '</span>',
sampleText: 'Osoba'
});
// Place
krInsertWikiEditorButton({
id: "mw-customeditbutton-place",
icon: "/wiki/resources/assets/custom-icons/button-place.png",
label: 'Place',
insertBefore: '<span class="name-place">',
insertAfter: '</span>',
sampleText: 'Místo'
});
// Date
krInsertWikiEditorButton({
id: "mw-customeditbutton-date",
icon: "/wiki/resources/assets/custom-icons/button-date.png",
label: 'Date',
insertBefore: '<span class="text-date">',
insertAfter: '</span>',
sampleText: 'Datum'
});
// English (blok)
krInsertWikiEditorButton({
id: "mw-customeditbutton-enblock",
icon: "/wiki/resources/assets/custom-icons/button-en.png",
label: 'English block',
insertBefore: '<div lang="en">',
insertAfter: '</div>',
sampleText: 'English text'
});
// Citace (blok)
krInsertWikiEditorButton({
id: "mw-customeditbutton-blockquote",
icon: "/wiki/resources/assets/custom-icons/button-blockquote.png",
label: 'Bloková citace',
insertBefore: '<blockquote>',
insertAfter: '</blockquote>',
sampleText: 'Citovaný odstavec'
});
// Citace (inline text)
krInsertWikiEditorButton({
id: "mw-customeditbutton-inlinequote",
icon: "/wiki/resources/assets/custom-icons/button-quote.png",
label: 'Řádková citace',
insertBefore: '<q>',
insertAfter: '</q>',
sampleText: 'Citovaný text'
});
});
/* Viz https://www.mediawiki.org/wiki/Manual:Custom_edit_buttons#Classic_edit_toolbar */
mw.hook( 'wikipage.editform' ).add( function () {
mw.loader.using( 'mediawiki.toolbar' ).then( function () {
mw.toolbar.addButton( {
imageFile: '/wiki/resources/assets/custom-icons/button-ship.png',
speedTip: 'Loď',
tagOpen: '<span class="name-ship">',
tagClose: '</span>',
sampleText: 'Jméno lodi',
imageId: 'button-ship'
} );
mw.toolbar.addButton( {
imageFile: '/wiki/resources/assets/custom-icons/button-person.png',
speedTip: 'Osoba',
tagOpen: '<span class="name-person">',
tagClose: '</span>',
sampleText: 'Jméno osoby',
imageId: 'button-person'
} );
mw.toolbar.addButton( {
imageFile: '/wiki/resources/assets/custom-icons/button-place.png',
speedTip: 'Místo',
tagOpen: '<span class="name-place">',
tagClose: '</span>',
sampleText: 'Jméno místa',
imageId: 'button-place'
} );
mw.toolbar.addButton( {
imageFile: '/wiki/resources/assets/custom-icons/button-date.png',
speedTip: 'Datum',
tagOpen: '<span class="text-date">',
tagClose: '</span>',
sampleText: 'Datum',
imageId: 'button-date'
} );
mw.toolbar.addButton( {
imageFile: '/wiki/resources/assets/custom-icons/button-en.png',
speedTip: 'English',
tagOpen: '<div lang="en">',
tagClose: '</div>',
sampleText: 'English text',
imageId: 'button-english'
} );
mw.toolbar.addButton( {
imageFile: '/wiki/resources/assets/custom-icons/button-blockquote.png',
speedTip: 'Bloková citace',
tagOpen: '<blockquote>',
tagClose: '</blockquote>',
sampleText: 'Citovaný odstavec',
imageId: 'button-blockquote'
} );
mw.toolbar.addButton( {
imageFile: '/wiki/resources/assets/custom-icons/button-quote.png',
speedTip: 'Řádková citace',
tagOpen: '<q>',
tagClose: '</q>',
sampleText: 'Citovaný text',
imageId: 'button-quote'
} );
} );
} );