MediaWiki:Gadget-templating.js: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
console.log('Wikibase Templating Gadget loaded'); | console.log('Wikibase Templating Gadget loaded'); | ||
$.getJSON('https://wikibase2.nlg.okfn.gr/wiki/Special:EntityData/Q196451.json', function (data) { | |||
console.log(data); // do something with the JSON | |||
}); | |||
WbTemplates = { | WbTemplates = { | ||
"person": { | "person": { | ||
Revision as of 19:55, 16 September 2025
console.log('Wikibase Templating Gadget loaded');
$.getJSON('https://wikibase2.nlg.okfn.gr/wiki/Special:EntityData/Q196451.json', function (data) {
console.log(data); // do something with the JSON
});
WbTemplates = {
"person": {
"label": "Person",
"prefilledClaims": [{
"property": {id: "P1", label: "instance of", datatype: "wikibase-item"},
"value": {
"mainVal": {id: "Q78", datatype: "wikibase-item"}
}
}],
"userDefinedClaims": [
{
"property": {id: "P162", label: "has authorized access point for person [a/datatype] (RDA:P50411)"},
datatype: "string"
},
{
"property": {id: "P1087", label: "has surname [a/datatype] (RDA:P50291)"},
datatype: "string"
},
{
"property": {id: "P579", label: "has given name [a/datatype] (RDA:P50292)"},
datatype: "string"
},
{
"property": {id: "P1105", label: "has term of rank or honour or office [a/datatype] (RDA:P50110)"},
datatype: "string"
},
{
"property": {id: "P1893", label: "has place of birth [a/object] (RDA:P50119)"},
datatype: "wikibase-item"
},
{
"property": {id: "P2251", label: "has profession or occupation [a/object] (RDA:P50104)"},
datatype: "wikibase-item"
},
{
"property": {id: "P2250", label: "has language of person [a/object] (RDA:P50102)"},
datatype: "wikibase-item"
},
{
"property": {id: "P1123", label: "has variant access point for person [a/datatype] (RDA:P50412)"},
datatype: "string"
},
{
"property": {id: "P2007", label: "has related corporate body of person [a/object] (RDA:P50318)"},
datatype: "wikibase-item"
},
{
"property": {id: "P756", label: "has note on person [a/datatype] (RDA:P50395)"},
datatype: "string"
},
],
},
"corporate": {
"label": "Corporate Body",
"prefilledClaims": [
{
"property": {id: "P1", label: "instance of", datatype: "wikibase-item"},
"value": {
"mainVal": {id: "Q72", datatype: "wikibase-item"}
}
}
],
"userDefinedClaims": [
{
"property": {id: "P10814", label: "has longitude and latitude (P60345)"},
datatype: "globe-coordinate"
},
{
"property": {id: "P160", label: "has authorized access point for corporate body [a/datatype] (RDA:P50407)"},
datatype: "string"
},
{
"property": {id: "P1121", label: "has variant access point for corporate body [a/datatype] (RDA:P50408)"},
datatype: "string"
},
{
"property": {id: "P754", label: "has note on corporate body [a/datatype] (RDA:P50393)"},
datatype: "string"
},
],
},
};
function statementExists(property, value) {
items.toArray().some(item => !!$(item).data().propertyId && $(item).data().statementgroupview.options.value.getKey() === property &&
$(item).data().statementgroupview.options.value.getItemContainer().toArray().some(claimItem =>
claimItem.getClaim().getMainSnak().getValue().getSerialization() === value));
}
function getPropertyEntity(property) {
return {
"id": `${property.id}`,
"title": `Property:${property.id}`,
"datatype": property.datatype,
"label": property.label,
};
}
function prefillStatement(claim, onlyProperty) {
if(onlyProperty) {
pendingStatement(claim.property);
return;
}
let statementListView = $(".wikibase-statementgrouplistview").first().data().wikibaseStatementgrouplistview;
statementListView.enterNewItem();
let items = statementListView.listview.items();
let item = items.last().data();
let sv = item.statementgroupview.statementlistview._listview.items().first().data().statementview;
let snak = sv.$mainSnak.data().snakview;
let es = getPropertyEntity(claim.property);
let selector = snak._getPropertySelector();
selector.element.val(es.label);
selector.element.attr("title", es.label);
selector._trigger('change');
selector._select(es);
snak._variation._valueView.element.one(
snak._variation._valueView.widgetEventPrefix + 'afterstartediting',
function() {
let valSelector = snak._variation._valueView._expert.$input.data().entityselector;
let valval = getPropertyEntity(claim.value.mainVal);
valSelector.element.val(valval.label);
valSelector._trigger("change");
valSelector._select(valval);
if(!!claim.qualifiers) {
let qlistview = sv._qualifiers;
qlistview.enterNewItem();
var qsnaklistview = qlistview.value()[qlistview.value().length - 1];
qsnaklistview.enterNewItem();
let qslv = $(sv._qualifiers.items().first()).data().snaklistview;
let qsnak = qslv._listview.items().first().data().snakview;
let qsel = qsnak._getPropertySelector();
qsel.element.val(es.label);
qsel._trigger('change');
qsel._select(es);
qsnak._variation._valueView.element.one(
qsnak._variation._valueView.widgetEventPrefix + 'afterstartediting',
function() {
let qvalSelector = qsnak._variation._valueView._expert.$input.data().entityselector;
let qvalval = getPropertyEntity(claim.value.mainVal);
qvalSelector.element.val(qvalval.label);
qvalSelector._trigger("change");
valSelector._trigger("change");
qvalSelector._select(qvalval);
}
);
qsnak._variation._valueView.element.one(
qsnak._variation._valueView.widgetEventPrefix + 'change',
function() {
let toolbar = item.statementgroupview.statementlistview._listview.items().last().data().edittoolbar;
toolbar._controller.stopEditing(false);
});
}
}
);
snak._variation._valueView.element.one(
snak._variation._valueView.widgetEventPrefix + 'change',
function() {
let toolbar = item.statementgroupview.statementlistview._listview.items().last().data().edittoolbar;
toolbar._controller.stopEditing(false);
});
}
function pendingStatement(claim) {
let prop = claim.property;
return new Promise((resolve, reject) => {
let statementListView = $(".wikibase-statementgrouplistview")
.first()
.data().wikibaseStatementgrouplistview;
statementListView.enterNewItem();
let items = statementListView.listview.items();
let item = items.last().data();
let sv = item.statementgroupview.statementlistview._listview.items();
let snak = $(sv).data().statementview.$mainSnak.data().snakview;
let selector = snak._getPropertySelector();
// Set up event listeners and chain them to resolve when finished.
selector.element.on('entityselectorselected', (event, entityId) => {
console.log('entityselectorselected');
$(snak._variation).on("afterdraw", function() {
console.log('afterdraw');
snak._variation._valueView.element.one(
snak._variation._valueView.widgetEventPrefix + 'afterstartediting',
function() {
console.log('afterstartediting');
// Simulate filling in values
if(claim.datatype === "wikibase-item"){
let valSelector = snak._variation._valueView._expert.$input.data().entityselector;
let jqe = snak._variation._valueView._expert.$input.data().jqueryEventSpecialEachchange;
valSelector.element.val("temp");
valSelector._trigger("change");
valSelector._select({id: "Q80", datatype: "wikibase-item"});
jqe.handlers[0].call();
jqe.handlers[1].call();
valSelector.element.val("");
valSelector._trigger("change");
//valSelector._select({});
jqe.handlers[0].call();
jqe.handlers[1].call();
}
else {
let valSelector = snak._variation._valueView._expert.$input.data().inputautoexpand;
let jqe = snak._variation._valueView._expert.$input.data().jqueryEventSpecialEachchange;
if(claim.datatype === "globe-coordinate"){
valSelector.$input.val("0,0");
jqe.handlers[0].call();
jqe.handlers[1].call();
}
else {
valSelector.$input.val("__");
jqe.handlers[0].call();
jqe.handlers[1].call();
}
valSelector.$input.val("");
jqe.handlers[0].call();
jqe.handlers[1].call();
}
// Once processing is complete, resolve the Promise.
resolve();
}
);
});
});
selector.element.val(prop.label);
selector._trigger('change');
selector._select(prop);
});
}
function addDetails(templateName) {
var claims = WbTemplates[templateName].userDefinedClaims;
var chain = Promise.resolve();
claims.forEach(function(claim) {
chain = chain.then(function() {
return pendingStatement(claim);
});
});
return chain;
}
function applyTemplate(templateName) {
WbTemplates[templateName].prefilledClaims.forEach(claim => {
prefillStatement(claim, false);
});
}
$(".wikibase-entitytermsview").append(`
<div class="wikibase-templating-section">
<div class="wikibase-templating-section-title"><span class="magic-wand-icon"></span> RDA Entity template</div>
<div class="wikibase-templating-help"><span class="settings-text">Select an RDA entity class to apply predifined template entries and additional entity details.</span></div>
<div class="wikibase-templating-form oo-ui-labelElement oo-ui-fieldLayout">
<div class=""><label for="wbtemplate">Entity class</label></div>
<div>
<select id="wbtemplate" class="cdx-select"></select>
</div>
</div>
<div class="mw-htmlform-submit-buttons">
<button id="applyTemplateBtn" class="cdx-button">Apply template</button>
<button id="addDetailsBtn" class="cdx-button">Add details</button>
</div>
</div>
`);
Object.entries(WbTemplates).forEach(entry => {
$('#wbtemplate').append($('<option>', {
value: entry[0],
text: entry[1].label
}));
});
$("#applyTemplateBtn").on("click", function() {
applyTemplate($("#wbtemplate").find(":selected").val());
});
$("#addDetailsBtn").on("click", function() {
addDetails($("#wbtemplate").find(":selected").val());
});