MediaWiki:Common.js: відмінності між версіями
Admin (обговорення | внесок) (CreateAccount: inject Thanks + login hint into benefits panel) |
Admin (обговорення | внесок) (Userlogin: register-panel now shows community stats + CTA) |
||
| Рядок 162: | Рядок 162: | ||
/* ======================================== | /* ======================================== | ||
Userlogin: панель реєстрації зі статистикою спільноти | |||
======================================== */ | ======================================== */ | ||
mw.loader.using(["mediawiki.util"], function () { | mw.loader.using(["mediawiki.util", "mediawiki.api"], function () { | ||
$(function () { | $(function () { | ||
var specialName = mw.config.get("wgCanonicalSpecialPageName"); | var specialName = mw.config.get("wgCanonicalSpecialPageName"); | ||
if (specialName !== "Userlogin | if (specialName !== "Userlogin") return; | ||
var loginCard = document.querySelector(".mw-body"); | var loginCard = document.querySelector(".mw-body"); | ||
if (!loginCard) return; | if (!loginCard) return; | ||
if (document.querySelector(".mw-register-panel")) return; | if (document.querySelector(".mw-register-panel")) return; | ||
var panel = document.createElement("aside"); | var panel = document.createElement("aside"); | ||
panel.className = "mw-register-panel"; | panel.className = "mw-register-panel"; | ||
| Рядок 184: | Рядок 178: | ||
var title = document.createElement("div"); | var title = document.createElement("div"); | ||
title.className = "mw-register-panel__title"; | title.className = "mw-register-panel__title"; | ||
title.textContent = | title.textContent = "Долучайтесь до спільноти"; | ||
var sub = document.createElement("div"); | var sub = document.createElement("div"); | ||
sub.className = "mw-register-panel__sub"; | sub.className = "mw-register-panel__sub"; | ||
sub.textContent = | sub.textContent = "Українці допомагають українцям за кордоном"; | ||
: " | var statsList = document.createElement("div"); | ||
statsList.className = "mw-createacct-benefits-list"; | |||
var stats = [ | |||
{ label: "редагувань", cls: "icon-edits" }, | |||
{ label: "сторінки", cls: "icon-pages" }, | |||
{ label: "дописувачі цього місяця", cls: "icon-contributors" } | |||
]; | |||
var nodes = stats.map(function (s) { | |||
var item = document.createElement("div"); | |||
item.className = "mw-number-text " + s.cls; | |||
var h3 = document.createElement("h3"); | |||
h3.textContent = "—"; | |||
var p = document.createElement("p"); | |||
p.textContent = s.label; | |||
item.appendChild(h3); | |||
item.appendChild(p); | |||
return item; | |||
}); | |||
nodes.forEach(function (n) { statsList.appendChild(n); }); | |||
var btn = document.createElement("a"); | var btn = document.createElement("a"); | ||
btn.className = "mw-register-panel__cta"; | btn.className = "mw-register-panel__cta"; | ||
btn.href = mw.util.getUrl("Special:CreateAccount"); | |||
btn.textContent = "Зареєструватись"; | |||
panel.appendChild(title); | panel.appendChild(title); | ||
panel.appendChild(sub); | panel.appendChild(sub); | ||
panel.appendChild(statsList); | |||
panel.appendChild(btn); | panel.appendChild(btn); | ||
loginCard.parentNode.insertBefore(panel, loginCard.nextSibling); | loginCard.parentNode.insertBefore(panel, loginCard.nextSibling); | ||
// Підтягнути живу статистику | |||
new mw.Api().get({ | |||
action: "query", | |||
meta: "siteinfo", | |||
siprop: "statistics", | |||
format: "json" | |||
}).then(function (data) { | |||
var s = data && data.query && data.query.statistics; | |||
if (!s) return; | |||
nodes[0].querySelector("h3").textContent = String(s.edits); | |||
nodes[1].querySelector("h3").textContent = String(s.pages); | |||
nodes[2].querySelector("h3").textContent = String(s.activeusers); | |||
}); | |||
}); | }); | ||
}); | }); | ||
/* ======================================== | /* ======================================== | ||
CreateAccount: "Дякуємо за участь!" + посилання на вхід | CreateAccount: "Дякуємо за участь!" + посилання на вхід | ||
| Рядок 238: | Рядок 261: | ||
benefits.appendChild(hint); | benefits.appendChild(hint); | ||
}); | }); | ||
Версія за 06:43, 23 травня 2026
mw.loader.using(["mediawiki.util"], function () {
$(function () {
var pageName = mw.config.get("wgPageName") || "";
if (pageName !== "🇷🇴_Румунія") return;
var cities = [
{ title: "Бухарест", page: "Румунія/Бухарест", exists: true },
{ title: "Клуж-Напока", page: "Румунія/Клуж-Напока", exists: false },
{ title: "Тімішоара", page: "Румунія/Тімішоара", exists: false },
{ title: "Брашов", page: "Румунія/Брашов", exists: false },
{ title: "Ясси", page: "Румунія/Ясси", exists: false },
{ title: "Сібіу", page: "Румунія/Сібіу", exists: false }
];
var skin = mw.config.get("skin");
if (skin === "minerva") {
buildMinervaCities(cities);
} else {
buildDesktopCitiesPortlet(cities);
}
});
function buildDesktopCitiesPortlet(cities) {
var portlet = null;
if (document.getElementById("p-tb")) {
portlet = mw.util.addPortlet("p-cities", "Міста", "#p-tb");
}
if (!portlet) {
portlet = mw.util.addPortlet("p-cities", "Міста");
var nav = document.getElementById("p-navigation");
if (nav && nav.parentNode) {
nav.parentNode.insertBefore(portlet, nav.nextSibling);
} else {
return;
}
}
cities.forEach(function (city) {
mw.util.addPortletLink("p-cities", mw.util.getUrl(city.page), city.title);
});
}
function buildMinervaCities(cities) {
var drawer = document.getElementById("mw-mf-page-left");
if (!drawer) return;
// Прибрати дефолтний portlet якщо він був створений (раптом)
var stale = document.getElementById("p-cities");
if (stale && stale.parentNode) stale.parentNode.removeChild(stale);
var section = document.createElement("div");
section.className = "cities-drawer-section";
var heading = document.createElement("h3");
heading.className = "cities-drawer-section__heading";
heading.textContent = "Міста";
section.appendChild(heading);
var ul = document.createElement("ul");
ul.className = "toggle-list__list cities-drawer-section__list";
cities.forEach(function (city) {
var li = document.createElement("li");
li.className = "toggle-list-item cities-drawer-item";
if (!city.exists) li.classList.add("cities-drawer-item--missing");
var a = document.createElement("a");
a.className = "toggle-list-item__anchor";
a.href = city.exists
? mw.util.getUrl(city.page)
: mw.util.getUrl(city.page, { action: "edit", redlink: 1 });
var icon = document.createElement("span");
icon.className = "minerva-icon cities-drawer-item__icon";
a.appendChild(icon);
var label = document.createElement("span");
label.className = "toggle-list-item__label";
label.textContent = city.title;
a.appendChild(label);
li.appendChild(a);
ul.appendChild(li);
});
section.appendChild(ul);
drawer.appendChild(section);
}
});
// Move .vector-page-toolbar into hero block (only on country pages with hero)
$(function () {
var pageName = mw.config.get("wgPageName") || "";
if (pageName !== "🇷🇴_Румунія") return;
var hero = document.querySelector(".vector-page-titlebar");
var toolbar = document.querySelector(".vector-page-toolbar");
if (hero && toolbar && toolbar.parentNode !== hero) {
hero.appendChild(toolbar);
}
});
// Country main pages — collapse all sections by default on Minerva
// (page name starts with regional indicator emoji pair = flag, no subpage separator)
function isCountryMainPage() {
var pageName = mw.config.get("wgPageName") || "";
if (pageName.indexOf("/") !== -1) return false;
return /^[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/.test(pageName);
}
mw.hook("wikipage.content").add(function () {
if (mw.config.get("skin") !== "minerva") return;
if (!isCountryMainPage()) return;
// Run after Minerva's section toggler has expanded sections
setTimeout(function () {
var nodes = document.querySelectorAll(
".collapsible-block.open-block, .section-heading.open-block, .collapsible-heading.open-block"
);
nodes.forEach(function (el) { el.classList.remove("open-block"); });
}, 0);
});
// Minerva drawer restyling — runs on every page (Minerva only)
$(function () {
if (mw.config.get("skin") !== "minerva") return;
var drawer = document.getElementById("mw-mf-page-left");
if (!drawer) return;
var hlist = drawer.querySelector("ul.hlist");
if (!hlist) return;
var aboutLi = hlist.querySelector("li:first-child");
var aboutLink = aboutLi && aboutLi.querySelector("a");
if (!aboutLink) return;
var banner = document.createElement("a");
banner.className = "drawer-about-banner";
banner.href = aboutLink.href;
var title = document.createElement("span");
title.className = "drawer-about-banner__title";
var kicker = document.createElement("span");
kicker.className = "drawer-about-banner__kicker";
kicker.textContent = "Що таке";
title.appendChild(kicker);
var name = document.createElement("span");
name.className = "drawer-about-banner__name";
name.textContent = "Країнопедія?";
title.appendChild(name);
banner.appendChild(title);
var arrow = document.createElement("span");
arrow.className = "drawer-about-banner__arrow";
arrow.setAttribute("aria-hidden", "true");
arrow.textContent = "\u2192";
banner.appendChild(arrow);
drawer.insertBefore(banner, drawer.firstChild);
aboutLi.parentNode.removeChild(aboutLi);
});
/* ========================================
Userlogin: панель реєстрації зі статистикою спільноти
======================================== */
mw.loader.using(["mediawiki.util", "mediawiki.api"], function () {
$(function () {
var specialName = mw.config.get("wgCanonicalSpecialPageName");
if (specialName !== "Userlogin") return;
var loginCard = document.querySelector(".mw-body");
if (!loginCard) return;
if (document.querySelector(".mw-register-panel")) return;
var panel = document.createElement("aside");
panel.className = "mw-register-panel";
var title = document.createElement("div");
title.className = "mw-register-panel__title";
title.textContent = "Долучайтесь до спільноти";
var sub = document.createElement("div");
sub.className = "mw-register-panel__sub";
sub.textContent = "Українці допомагають українцям за кордоном";
var statsList = document.createElement("div");
statsList.className = "mw-createacct-benefits-list";
var stats = [
{ label: "редагувань", cls: "icon-edits" },
{ label: "сторінки", cls: "icon-pages" },
{ label: "дописувачі цього місяця", cls: "icon-contributors" }
];
var nodes = stats.map(function (s) {
var item = document.createElement("div");
item.className = "mw-number-text " + s.cls;
var h3 = document.createElement("h3");
h3.textContent = "—";
var p = document.createElement("p");
p.textContent = s.label;
item.appendChild(h3);
item.appendChild(p);
return item;
});
nodes.forEach(function (n) { statsList.appendChild(n); });
var btn = document.createElement("a");
btn.className = "mw-register-panel__cta";
btn.href = mw.util.getUrl("Special:CreateAccount");
btn.textContent = "Зареєструватись";
panel.appendChild(title);
panel.appendChild(sub);
panel.appendChild(statsList);
panel.appendChild(btn);
loginCard.parentNode.insertBefore(panel, loginCard.nextSibling);
// Підтягнути живу статистику
new mw.Api().get({
action: "query",
meta: "siteinfo",
siprop: "statistics",
format: "json"
}).then(function (data) {
var s = data && data.query && data.query.statistics;
if (!s) return;
nodes[0].querySelector("h3").textContent = String(s.edits);
nodes[1].querySelector("h3").textContent = String(s.pages);
nodes[2].querySelector("h3").textContent = String(s.activeusers);
});
});
});
/* ========================================
CreateAccount: "Дякуємо за участь!" + посилання на вхід
у кінець benefits-панелі (приватна правка нижче register-panel блоку)
======================================== */
mw.loader.using(["mediawiki.util"], function () {
$(function () {
var specialName = mw.config.get("wgCanonicalSpecialPageName");
if (specialName !== "CreateAccount") return;
var benefits = document.querySelector(".mw-createacct-benefits-container");
if (!benefits) return;
if (benefits.querySelector(".benefits-thanks")) return;
var thanks = document.createElement("div");
thanks.className = "benefits-thanks";
thanks.textContent = "Дякуємо за участь!";
var hint = document.createElement("div");
hint.className = "benefits-login-hint";
hint.appendChild(document.createTextNode("Уже маєте акаунт? "));
var link = document.createElement("a");
link.href = mw.util.getUrl("Special:UserLogin");
link.textContent = "Увійти";
hint.appendChild(link);
benefits.appendChild(thanks);
benefits.appendChild(hint);
});