MediaWiki:Gadget-templating.js: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
/* global mw, $ */ | /* global mw, $ */ | ||
mw.loader.using(['mediawiki.api']).done(function () { | |||
// ===== 0) CONFIG ===== | |||
var SEARCH_QUERY = 'haswbstatement:P1=Q196450'; // exactly what works in Special:Search | |||
var WbTemplates = {}; | |||
var api = new mw.Api(); | |||
var userLang = mw.config.get('wgUserLanguage') || 'en'; | |||
// ===== 1) Small helpers (ES5-safe) ===== | |||
// | function chunk(arr, n) { | ||
var out = [], i; | |||
// | for (i = 0; i < arr.length; i += n) out.push(arr.slice(i, i + n)); | ||
return out; | |||
} | |||
function getBestLabel(labels) { | |||
if (!labels) return undefined; | |||
if (labels[userLang] && labels[userLang].value) return labels[userLang].value; | |||
for (var k in labels) { | |||
if (labels[k] && labels[k].value) return labels[k].value; | |||
} | |||
return undefined; | |||
} | |||
function isPlaceholderSnak(snak) { | |||
if (!snak || snak.snaktype !== 'value' || !snak.datavalue) return false; | |||
var dt = snak.datatype; | |||
var v = snak.datavalue.value; | |||
if (dt === 'string' || dt === 'external-id' || dt === 'url') return v === '_'; | |||
if (dt === 'monolingualtext') return v && v.text === '_'; | |||
return false; | |||
} | |||
function cleanTemplateLabel(raw) { | |||
if (!raw) return ''; | |||
return raw.replace(/^RDA\s*/i, '').replace(/\s*Template$/i, '').trim(); | |||
} | |||
function slugify(s) { | |||
if (!s) return ''; | |||
// simple slug (ASCII only) | |||
return s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, ''); | |||
} | |||
// ===== 2) API: search → entities → property meta ===== | |||
function searchTemplates(query) { | |||
return api.get({ | |||
action: 'query', | |||
list: 'search', | |||
srsearch: query, | |||
srbackend: 'CirrusSearch', | |||
srqiprofile: 'wikibase', | |||
srlimit: 50, | |||
formatversion: 2 | |||
}).then(function (res) { | |||
var hits = (res.query && res.query.search) || []; | |||
var ids = []; | |||
} | for (var i = 0; i < hits.length; i++) { | ||
var m = /Q\d+$/.exec(hits[i].title); | |||
if (m) ids.push(m[0]); | |||
. | } | ||
return ids; | |||
}); | |||
} | |||
function fetchEntities(ids) { | |||
var out = {}; | |||
var batches = chunk(ids, 50); | |||
action: ' | var d = $.Deferred(); | ||
(function next(i) { | |||
if (i >= batches.length) { d.resolve(out); return; } | |||
api.get({ | |||
action: 'wbgetentities', | |||
ids: batches[i].join('|'), | |||
props: 'labels|claims', | |||
languages: userLang | |||
}) | }).then(function (res) { | ||
$.extend(out, res.entities || {}); | |||
next(i + 1); | |||
}).fail(d.reject); | |||
})(0); | |||
return d.promise(); | |||
} | |||
function fetchPropertyMeta(entityMap) { | |||
var pids = {}; | |||
for (var qid in entityMap) { | |||
var claims = entityMap[qid].claims || {}; | |||
for (var pid in claims) pids[pid] = true; | |||
} | } | ||
var ids = Object.keys(pids); | |||
var out = {}; | |||
var batches = chunk(ids, 50); | |||
var d = $.Deferred(); | |||
(function next(i) { | |||
if (i >= batches.length) { d.resolve(out); return; } | |||
api.get({ | |||
action: 'wbgetentities', | |||
ids: batches[i].join('|'), | |||
props: 'labels|datatype', | |||
languages: userLang | |||
}).then(function (res) { | |||
$.extend(out, res.entities || {}); | |||
} | next(i + 1); | ||
}).fail(d.reject); | |||
})(0); | |||
return d.promise().then(function () { | |||
// normalize | // normalize | ||
var meta = {}; | |||
for ( | for (var pid in out) { | ||
var ent = out[pid] || {}; | |||
meta[pid] = { | meta[pid] = { | ||
id: pid, | id: pid, | ||
label: getBestLabel(ent.labels) || pid, | label: getBestLabel(ent.labels) || pid, | ||
datatype: ent.datatype | datatype: ent.datatype | ||
}; | }; | ||
} | } | ||
return meta; | return meta; | ||
} | }); | ||
} | |||
// ===== 3) Transform to your WbTemplates shape ===== | |||
function transformToTemplate(entity, propMeta) { | |||
var rawLabel = getBestLabel(entity.labels) || entity.id; | |||
var label = cleanTemplateLabel(rawLabel); | |||
var prefilledClaims = []; | |||
var userDefinedClaims = []; | |||
var claims = entity.claims || {}; | |||
for (var pid in claims) { | |||
var statements = claims[pid]; | |||
if (!statements || !statements.length) continue; | |||
var prop = propMeta[pid] || { id: pid, label: pid, datatype: 'string' }; | |||
// find first non-placeholder | |||
var firstNonPlaceholder = null; | |||
for (var i = 0; i < statements.length; i++) { | |||
var ms = statements[i] && statements[i].mainsnak; | |||
if (ms && ms.snaktype === 'value' && !isPlaceholderSnak(ms)) { | |||
firstNonPlaceholder = ms; | |||
break; | |||
} | } | ||
} | } | ||
if (firstNonPlaceholder && prop.datatype === 'wikibase-item') { | |||
var v = firstNonPlaceholder.datavalue && firstNonPlaceholder.datavalue.value; | |||
prefilledClaims.push({ | |||
property: { id: prop.id, label: prop.label, datatype: prop.datatype }, | |||
value: { mainVal: { id: v && v.id, datatype: 'wikibase-item' } } | |||
}); | |||
} else { | |||
userDefinedClaims.push({ | |||
property: { id: prop.id, label: prop.label }, | |||
datatype: prop.datatype | |||
}); | |||
} | |||
} | } | ||
return { key: slugify(label), label: label, prefilledClaims: prefilledClaims, userDefinedClaims: userDefinedClaims }; | |||
} | |||
function buildWbTemplatesFromQuery(query) { | |||
return searchTemplates(query).then(function (qids) { | |||
if (!qids.length) return {}; | if (!qids.length) return {}; | ||
return fetchEntities(qids).then(function (entities) { | |||
return fetchPropertyMeta(entities).then(function (propMeta) { | |||
var map = {}; | |||
for (var eid in entities) { | |||
var tpl = transformToTemplate(entities[eid], propMeta); | |||
map[tpl.key] = { | |||
label: tpl.label, | |||
prefilledClaims: tpl.prefilledClaims, | |||
userDefinedClaims: tpl.userDefinedClaims | |||
}; | |||
} | |||
return map; | |||
}); | |||
}); | }); | ||
}); | |||
} | |||
// ===== 4) YOUR existing helpers (unchanged) ===== | |||
function statementExists(property, value) { | |||
items.toArray().some(function (item) { | |||
return !!$(item).data().propertyId && | |||
$(item).data().statementgroupview.options.value.getKey() === property && | |||
$(item).data().statementgroupview.options.value.getItemContainer().toArray().some(function (claimItem) { | |||
return claimItem.getClaim().getMainSnak().getValue().getSerialization() === value; | |||
}); | |||
}); | |||
} | |||
function getPropertyEntity(property) { | |||
return { | |||
id: String(property.id), | |||
title: 'Property:' + property.id, | |||
datatype: property.datatype, | |||
label: property.label | |||
}; | |||
} | |||
function prefillStatement(claim, onlyProperty) { | |||
if (onlyProperty) { | |||
pendingStatement(claim.property); | |||
return; | |||
} | } | ||
var statementListView = $('.wikibase-statementgrouplistview').first().data().wikibaseStatementgrouplistview; | |||
statementListView.enterNewItem(); | |||
var items = statementListView.listview.items(); | |||
var item = items.last().data(); | |||
var sv = item.statementgroupview.statementlistview._listview.items().first().data().statementview; | |||
var snak = sv.$mainSnak.data().snakview; | |||
var es = getPropertyEntity(claim.property); | |||
var 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 () { | |||
var valSelector = snak._variation._valueView._expert.$input.data().entityselector; | |||
var valval = getPropertyEntity(claim.value.mainVal); | |||
valSelector.element.val(valval.label); | |||
valSelector._trigger('change'); | |||
valSelector._select(valval); | |||
if (!!claim.qualifiers) { | |||
var qlistview = sv._qualifiers; | |||
qlistview.enterNewItem(); | |||
var qsnaklistview = qlistview.value()[qlistview.value().length - 1]; | |||
qsnaklistview.enterNewItem(); | |||
var qslv = $(sv._qualifiers.items().first()).data().snaklistview; | |||
var qsnak = qslv._listview.items().first().data().snakview; | |||
var 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 () { | |||
var qvalSelector = qsnak._variation._valueView._expert.$input.data().entityselector; | |||
var 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 () { | |||
var toolbar = item.statementgroupview.statementlistview._listview.items().last().data().edittoolbar; | |||
toolbar._controller.stopEditing(false); | |||
}); | |||
} | } | ||
); | } | ||
); | |||
snak._variation._valueView.element.one( | |||
snak._variation._valueView.widgetEventPrefix + 'change', | |||
function () { | |||
var toolbar = item.statementgroupview.statementlistview._listview.items().last().data().edittoolbar; | |||
toolbar._controller.stopEditing(false); | |||
}); | |||
} | |||
function pendingStatement(claim) { | |||
var prop = claim.property; | |||
return new Promise(function (resolve, reject) { | |||
var statementListView = $('.wikibase-statementgrouplistview').first().data().wikibaseStatementgrouplistview; | |||
statementListView.enterNewItem(); | |||
var items = statementListView.listview.items(); | |||
var item = items.last().data(); | |||
var sv = item.statementgroupview.statementlistview._listview.items(); | |||
var snak = $(sv).data().statementview.$mainSnak.data().snakview; | |||
var selector = snak._getPropertySelector(); | |||
selector.element.on('entityselectorselected', function () { | |||
$(snak._variation).on('afterdraw', function () { | |||
snak._variation._valueView.element.one( | |||
snak._variation._valueView.widgetEventPrefix + 'afterstartediting', | |||
function () { | |||
if (claim.datatype === 'wikibase-item') { | |||
var valSelector = snak._variation._valueView._expert.$input.data().entityselector; | |||
var 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'); | |||
jqe.handlers[0].call(); | |||
jqe.handlers[1].call(); | |||
} else { | |||
var valSelector2 = snak._variation._valueView._expert.$input.data().inputautoexpand; | |||
var jqe2 = snak._variation._valueView._expert.$input.data().jqueryEventSpecialEachchange; | |||
if (claim.datatype === 'globe-coordinate') { | |||
valSelector2.$input.val('0,0'); | |||
jqe2.handlers[0].call(); | |||
jqe2.handlers[1].call(); | |||
} else { | |||
valSelector2.$input.val('__'); | |||
jqe2.handlers[0].call(); | |||
jqe2.handlers[1].call(); | |||
} | } | ||
valSelector2.$input.val(''); | |||
jqe2.handlers[0].call(); | |||
jqe2.handlers[1].call(); | |||
} | } | ||
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(function (claim) { | |||
prefillStatement(claim, false); | |||
}); | |||
} | |||
// ===== 5) UI (render AFTER templates are loaded) ===== | |||
function initTemplatingUI() { | |||
var html = '' | |||
+ '<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 predefined 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>'; | |||
$('.wikibase-entitytermsview').append(html); | |||
var key; | |||
for (key in WbTemplates) { | |||
$('#wbtemplate').append($('<option>', { | |||
value: key, | |||
text: WbTemplates[key].label | |||
})); | |||
} | } | ||
function | $('#applyTemplateBtn').on('click', function () { | ||
applyTemplate($('#wbtemplate').find(':selected').val()); | |||
}); | |||
$('#addDetailsBtn').on('click', function () { | |||
addDetails($('#wbtemplate').find(':selected').val()); | |||
}); | |||
} | |||
// ===== 6) Build templates, then render UI ===== | |||
function | buildWbTemplatesFromQuery(SEARCH_QUERY) | ||
// | .then(function (map) { | ||
WbTemplates = map; | |||
window.WbTemplates = WbTemplates; // if you need it elsewhere | |||
if (!WbTemplates || !Object.keys(WbTemplates).length) { | if (!WbTemplates || !Object.keys(WbTemplates).length) { | ||
console.warn('No templates found for query:', SEARCH_QUERY); | console.warn('No templates found for query:', SEARCH_QUERY); | ||
return; | return; | ||
} | } | ||
initTemplatingUI(); | |||
}) | |||
.fail(function (err) { | |||
// If this fails for anonymous users, it might be auth/profile config | |||
// related; try while logged in. | |||
console.error('Template build failed:', err); | |||
}); | |||
}); | }); | ||
Revision as of 18:31, 17 September 2025
/* global mw, $ */
mw.loader.using(['mediawiki.api']).done(function () {
// ===== 0) CONFIG =====
var SEARCH_QUERY = 'haswbstatement:P1=Q196450'; // exactly what works in Special:Search
var WbTemplates = {};
var api = new mw.Api();
var userLang = mw.config.get('wgUserLanguage') || 'en';
// ===== 1) Small helpers (ES5-safe) =====
function chunk(arr, n) {
var out = [], i;
for (i = 0; i < arr.length; i += n) out.push(arr.slice(i, i + n));
return out;
}
function getBestLabel(labels) {
if (!labels) return undefined;
if (labels[userLang] && labels[userLang].value) return labels[userLang].value;
for (var k in labels) {
if (labels[k] && labels[k].value) return labels[k].value;
}
return undefined;
}
function isPlaceholderSnak(snak) {
if (!snak || snak.snaktype !== 'value' || !snak.datavalue) return false;
var dt = snak.datatype;
var v = snak.datavalue.value;
if (dt === 'string' || dt === 'external-id' || dt === 'url') return v === '_';
if (dt === 'monolingualtext') return v && v.text === '_';
return false;
}
function cleanTemplateLabel(raw) {
if (!raw) return '';
return raw.replace(/^RDA\s*/i, '').replace(/\s*Template$/i, '').trim();
}
function slugify(s) {
if (!s) return '';
// simple slug (ASCII only)
return s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
}
// ===== 2) API: search → entities → property meta =====
function searchTemplates(query) {
return api.get({
action: 'query',
list: 'search',
srsearch: query,
srbackend: 'CirrusSearch',
srqiprofile: 'wikibase',
srlimit: 50,
formatversion: 2
}).then(function (res) {
var hits = (res.query && res.query.search) || [];
var ids = [];
for (var i = 0; i < hits.length; i++) {
var m = /Q\d+$/.exec(hits[i].title);
if (m) ids.push(m[0]);
}
return ids;
});
}
function fetchEntities(ids) {
var out = {};
var batches = chunk(ids, 50);
var d = $.Deferred();
(function next(i) {
if (i >= batches.length) { d.resolve(out); return; }
api.get({
action: 'wbgetentities',
ids: batches[i].join('|'),
props: 'labels|claims',
languages: userLang
}).then(function (res) {
$.extend(out, res.entities || {});
next(i + 1);
}).fail(d.reject);
})(0);
return d.promise();
}
function fetchPropertyMeta(entityMap) {
var pids = {};
for (var qid in entityMap) {
var claims = entityMap[qid].claims || {};
for (var pid in claims) pids[pid] = true;
}
var ids = Object.keys(pids);
var out = {};
var batches = chunk(ids, 50);
var d = $.Deferred();
(function next(i) {
if (i >= batches.length) { d.resolve(out); return; }
api.get({
action: 'wbgetentities',
ids: batches[i].join('|'),
props: 'labels|datatype',
languages: userLang
}).then(function (res) {
$.extend(out, res.entities || {});
next(i + 1);
}).fail(d.reject);
})(0);
return d.promise().then(function () {
// normalize
var meta = {};
for (var pid in out) {
var ent = out[pid] || {};
meta[pid] = {
id: pid,
label: getBestLabel(ent.labels) || pid,
datatype: ent.datatype
};
}
return meta;
});
}
// ===== 3) Transform to your WbTemplates shape =====
function transformToTemplate(entity, propMeta) {
var rawLabel = getBestLabel(entity.labels) || entity.id;
var label = cleanTemplateLabel(rawLabel);
var prefilledClaims = [];
var userDefinedClaims = [];
var claims = entity.claims || {};
for (var pid in claims) {
var statements = claims[pid];
if (!statements || !statements.length) continue;
var prop = propMeta[pid] || { id: pid, label: pid, datatype: 'string' };
// find first non-placeholder
var firstNonPlaceholder = null;
for (var i = 0; i < statements.length; i++) {
var ms = statements[i] && statements[i].mainsnak;
if (ms && ms.snaktype === 'value' && !isPlaceholderSnak(ms)) {
firstNonPlaceholder = ms;
break;
}
}
if (firstNonPlaceholder && prop.datatype === 'wikibase-item') {
var v = firstNonPlaceholder.datavalue && firstNonPlaceholder.datavalue.value;
prefilledClaims.push({
property: { id: prop.id, label: prop.label, datatype: prop.datatype },
value: { mainVal: { id: v && v.id, datatype: 'wikibase-item' } }
});
} else {
userDefinedClaims.push({
property: { id: prop.id, label: prop.label },
datatype: prop.datatype
});
}
}
return { key: slugify(label), label: label, prefilledClaims: prefilledClaims, userDefinedClaims: userDefinedClaims };
}
function buildWbTemplatesFromQuery(query) {
return searchTemplates(query).then(function (qids) {
if (!qids.length) return {};
return fetchEntities(qids).then(function (entities) {
return fetchPropertyMeta(entities).then(function (propMeta) {
var map = {};
for (var eid in entities) {
var tpl = transformToTemplate(entities[eid], propMeta);
map[tpl.key] = {
label: tpl.label,
prefilledClaims: tpl.prefilledClaims,
userDefinedClaims: tpl.userDefinedClaims
};
}
return map;
});
});
});
}
// ===== 4) YOUR existing helpers (unchanged) =====
function statementExists(property, value) {
items.toArray().some(function (item) {
return !!$(item).data().propertyId &&
$(item).data().statementgroupview.options.value.getKey() === property &&
$(item).data().statementgroupview.options.value.getItemContainer().toArray().some(function (claimItem) {
return claimItem.getClaim().getMainSnak().getValue().getSerialization() === value;
});
});
}
function getPropertyEntity(property) {
return {
id: String(property.id),
title: 'Property:' + property.id,
datatype: property.datatype,
label: property.label
};
}
function prefillStatement(claim, onlyProperty) {
if (onlyProperty) {
pendingStatement(claim.property);
return;
}
var statementListView = $('.wikibase-statementgrouplistview').first().data().wikibaseStatementgrouplistview;
statementListView.enterNewItem();
var items = statementListView.listview.items();
var item = items.last().data();
var sv = item.statementgroupview.statementlistview._listview.items().first().data().statementview;
var snak = sv.$mainSnak.data().snakview;
var es = getPropertyEntity(claim.property);
var 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 () {
var valSelector = snak._variation._valueView._expert.$input.data().entityselector;
var valval = getPropertyEntity(claim.value.mainVal);
valSelector.element.val(valval.label);
valSelector._trigger('change');
valSelector._select(valval);
if (!!claim.qualifiers) {
var qlistview = sv._qualifiers;
qlistview.enterNewItem();
var qsnaklistview = qlistview.value()[qlistview.value().length - 1];
qsnaklistview.enterNewItem();
var qslv = $(sv._qualifiers.items().first()).data().snaklistview;
var qsnak = qslv._listview.items().first().data().snakview;
var 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 () {
var qvalSelector = qsnak._variation._valueView._expert.$input.data().entityselector;
var 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 () {
var toolbar = item.statementgroupview.statementlistview._listview.items().last().data().edittoolbar;
toolbar._controller.stopEditing(false);
});
}
}
);
snak._variation._valueView.element.one(
snak._variation._valueView.widgetEventPrefix + 'change',
function () {
var toolbar = item.statementgroupview.statementlistview._listview.items().last().data().edittoolbar;
toolbar._controller.stopEditing(false);
});
}
function pendingStatement(claim) {
var prop = claim.property;
return new Promise(function (resolve, reject) {
var statementListView = $('.wikibase-statementgrouplistview').first().data().wikibaseStatementgrouplistview;
statementListView.enterNewItem();
var items = statementListView.listview.items();
var item = items.last().data();
var sv = item.statementgroupview.statementlistview._listview.items();
var snak = $(sv).data().statementview.$mainSnak.data().snakview;
var selector = snak._getPropertySelector();
selector.element.on('entityselectorselected', function () {
$(snak._variation).on('afterdraw', function () {
snak._variation._valueView.element.one(
snak._variation._valueView.widgetEventPrefix + 'afterstartediting',
function () {
if (claim.datatype === 'wikibase-item') {
var valSelector = snak._variation._valueView._expert.$input.data().entityselector;
var 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');
jqe.handlers[0].call();
jqe.handlers[1].call();
} else {
var valSelector2 = snak._variation._valueView._expert.$input.data().inputautoexpand;
var jqe2 = snak._variation._valueView._expert.$input.data().jqueryEventSpecialEachchange;
if (claim.datatype === 'globe-coordinate') {
valSelector2.$input.val('0,0');
jqe2.handlers[0].call();
jqe2.handlers[1].call();
} else {
valSelector2.$input.val('__');
jqe2.handlers[0].call();
jqe2.handlers[1].call();
}
valSelector2.$input.val('');
jqe2.handlers[0].call();
jqe2.handlers[1].call();
}
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(function (claim) {
prefillStatement(claim, false);
});
}
// ===== 5) UI (render AFTER templates are loaded) =====
function initTemplatingUI() {
var html = ''
+ '<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 predefined 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>';
$('.wikibase-entitytermsview').append(html);
var key;
for (key in WbTemplates) {
$('#wbtemplate').append($('<option>', {
value: key,
text: WbTemplates[key].label
}));
}
$('#applyTemplateBtn').on('click', function () {
applyTemplate($('#wbtemplate').find(':selected').val());
});
$('#addDetailsBtn').on('click', function () {
addDetails($('#wbtemplate').find(':selected').val());
});
}
// ===== 6) Build templates, then render UI =====
buildWbTemplatesFromQuery(SEARCH_QUERY)
.then(function (map) {
WbTemplates = map;
window.WbTemplates = WbTemplates; // if you need it elsewhere
if (!WbTemplates || !Object.keys(WbTemplates).length) {
console.warn('No templates found for query:', SEARCH_QUERY);
return;
}
initTemplatingUI();
})
.fail(function (err) {
// If this fails for anonymous users, it might be auth/profile config
// related; try while logged in.
console.error('Template build failed:', err);
});
});