משתמש:מיכי י-ם/form.js
מראה
הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
- פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
- גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
- אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
mw.loader
.using([
"mediawiki.api",
"mediawiki.util",
"oojs-ui-core",
"oojs-ui-widgets",
"mediawiki.widgets.UsersMultiselectWidget",
])
.then(() => {
const api = new mw.Api();
const pageName = new mw.Title(mw.config.get("wgPageName"));
const getContributors = async (page) => {
const params = {
prop: "contributors|revisions",
titles: page,
utf8: 1,
formatversion: "2",
pcexcludegroup: "bot",
pclimit: "6",
rvprop: "user|timestamp",
rvlimit: "1",
rvdir: "newer",
};
try {
const { query } = await api.get(params);
if (!query.pages) {
throw new Error("page not found");
}
let contributors = query.pages[0].contributors.map((c) => c.name);
if (contributors.length > 5) {
const res = await fetch(
`https://xtools.wmcloud.org/api/page/top_editors/he.wikipedia/${page}///5?nobots=1`
);
const { top_editors } = await res.json();
contributors = top_editors.map((c) => c.username);
contributors[contributors.length - 1] += " (על בסיס XTools)";
}
const contributorsString = contributors.join(", ");
return {
author: query.pages[0].revisions[0].user || "",
contributors: contributorsString,
};
} catch (error) {
console.error(error);
return null;
}
};
function ImportanceDialog(config) {
ImportanceDialog.super.call(this, config);
}
OO.inheritClass(ImportanceDialog, OO.ui.ProcessDialog);
// Specify a name for .addWindows()
ImportanceDialog.static.name = "importanceDialog";
// Specify a static title and actions.
ImportanceDialog.static.title = "פתיחת דיון חשיבות";
ImportanceDialog.static.size = "medium";
ImportanceDialog.static.actions = [
{
action: "save",
label: "שליחה",
flags: ["primary", "progressive"],
},
{
label: "סגירה",
flags: "safe",
},
];
// Use the initialize() method to add content to the dialog's $body,
// to initialize widgets, and to set up event handlers.
ImportanceDialog.prototype.initialize = function () {
ImportanceDialog.super.prototype.initialize.apply(this, arguments);
this.content = new OO.ui.PanelLayout({
padded: true,
expanded: false,
});
this.inputExplanation = new OO.ui.TextInputWidget({
indicator: "required",
placeholder: "משהו כמו: רחוק מהרף לסופרים, עילה אחרת לא קיימת בערך.",
});
this.labelExplanation = new OO.ui.FieldLayout(this.inputExplanation, {
label: "הסבר קצר להנחת התבנית",
align: "top",
});
this.inputUser = new mw.widgets.UsersMultiselectWidget({});
this.labelUser = new OO.ui.FieldLayout(this.inputUser, {
id: "importanceDialog-users-pinging",
label: "משתמשים לתיוג בדיון",
align: "top",
help: "יוצר הערך, תורמים משמעותיים",
helpInline: true,
});
this.tgl = new OO.ui.CheckboxInputWidget({
checked: false,
});
this.labelTgl = new OO.ui.FieldLayout(this.tgl, {
label: "להנחת התבנית בדף השיחה",
align: "inline",
});
this.content.$element.append(
this.labelExplanation.$element,
this.labelUser.$element,
this.labelTgl.$element
);
this.inputExplanation.connect(this, { change: "validate" });
this.$body.append(this.content.$element);
};
ImportanceDialog.prototype.validate = function (value) {
this.actions.setAbilities({ save: value.length > 35 });
};
ImportanceDialog.prototype.getSetupProcess = function (data) {
return ImportanceDialog.super.prototype.getSetupProcess
.call(this, data)
.next(function () {
this.actions.setAbilities({ save: false });
}, this)
.next(async function () {
try {
const { author, contributors } = await getContributors(pageName.title);
$("#importanceDialog-users-pinging .oo-ui-inline-help").text(
`יוצר הערך: ${author}. תורמים: ${contributors}`
);
} catch { }
}, this);
};
// Use the getActionProcess() method to specify a process to handle the
// actions (for the 'save' action, in this example).
ImportanceDialog.prototype.getActionProcess = function (action) {
var dialog = this;
const explanation = dialog.inputExplanation.getValue();
const users = dialog.inputUser.getValue();
const usersString = users.length > 0
? users.map((u) => `@[[User:${u}|${u}]]`).join(", ")
: "";
const talk = dialog.tgl.getValue();
if (action === "cancel") {
return new OO.ui.Process(function () {
dialog.close();
});
} else if (action === "save") {
return new OO.ui.Process(function () {
api.postWithEditToken({
action: "edit",
title: talk ? pageName.getTalkPage().getPrefixedText() : pageName.getPrefixedText(),
prependtext: text,
summary: "דיון חשיבות"
})
.done(function (data) {
return;
})
.fail(function (error) {
console.error(error);
return new OO.ui.Error("אירעה שגיאה בשמירת התבנית");
});
})
.next(function () {
api.newSection(
"Talk:" + pageName,
"דיון חשיבות",
`${explanation}. `
)
.done(function (data) {
return;
})
.fail(function (error) {
console.error(error);
return new OO.ui.Error("אירעה שגיאה בפתיחת הדיון!");
});
}, this)
.next(function () {
this.close();
}, this);
}
// Fallback to parent handler.
return ImportanceDialog.super.prototype.getActionProcess.call(this, action);
};
// Get dialog height.
ImportanceDialog.prototype.getBodyHeight = function () {
return this.content.$element.outerHeight(true) + 50;
};
// Create and append the window manager.
var windowManager = new OO.ui.WindowManager();
$(document.body).append(windowManager.$element);
// Create a new dialog window.
var importanceDialog = new ImportanceDialog();
const idNamespace = mw.config.get("wgNamespaceNumber");
if ([10, 14].includes(idNamespace) || idNamespace === 0) {
// Add windows to window manager using the addWindows() method.
windowManager.addWindows([importanceDialog]);
$(mw.util.addPortletLink('p-cactions', '#', "דיון חשיבות")).click(() => {
// Open the window.
windowManager.openWindow(importanceDialog);
});
}
});