Jump to content

MediaWiki:Gadget-templating.js: Difference between revisions

From National Library of Greece
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());
});