User:Teester/ConstraintSummary.js
Jump to navigation
Jump to search
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
var entityID = mw.config.get( 'wbEntityId' );
var violation = 0;
var warning = 0;
var violationStatus = {};
var warningStatus = {};
function analyseJson(data) {
for (var claim in data.wbcheckconstraints[this.entityID].claims) {
properties = data.wbcheckconstraints[this.entityID].claims[claim];
for (var property in properties) {
for (var referencesResult in properties[property].mainsnak.results) {
var type = properties[property].mainsnak.results[referencesResult].constraint.typeLabel;
var status = properties[property].mainsnak.results[referencesResult].status;
addError(type, status);
}
if (properties[property].references) {
analyseReferences(properties[property].references);
}
if (properties[property].qualifiers) {
analyseQualifiers(properties[property].qualifiers);
}
}
}
buildConstraintInfo();
}
function analyseReferences(reference) {
for (var result in reference) {
snaks = reference[result].snaks;
for (var snak in snaks) {
numbers = snaks[snak];
for (var number in numbers) {
snakResults = numbers[number].results;
for (var snakResult in snakResults) {
var type = snakResults[snakResult].constraint.typeLabel;
var status = snakResults[snakResult].status;
addError(type, status);
}
}
}
}
}
function analyseQualifiers(qualifier) {
for (var qualifierResult in qualifier) {
qualifierSnaks = qualifier[qualifierResult];
for (var qualifierSnak in qualifierSnaks) {
qualifierNumbers = qualifierSnaks[qualifierSnak].results;
for (var qualifierNumber in qualifierNumbers) {
var type = qualifierNumbers[qualifierNumber].constraint.typeLabel;
var status = qualifierNumbers[qualifierNumber].status;
addError(type, status);
}
}
}
}
function addError(type, status) {
if (status == "violation") {
this.violation = this.violation + 1;
if(this.violationStatus[type] === parseInt(this.violationStatus[type], 10)) {
this.violationStatus[type] += 1;
} else {
this.violationStatus[type] = 1;
} }
if (status == "warning") {
this.warning = this.warning + 1;
if(this.warningStatus[type] === parseInt(this.warningStatus[type], 10)) {
this.warningStatus[type] += 1;
} else {
this.warningStatus[type] = 1;
}
}
}
function buildStatusString(status) {
var statusString = "";
for (var key in status) {
statusString += "\t•\t" + status[key] + " " + key;
if (status[key] == 1) {
statusString += "\n";
} else {
statusString += "s\n";
}
}
return statusString;
}
function buildConstraintInfo() {
var violationStatusString = buildStatusString(this.violationStatus);
var warningStatusString = buildStatusString(this.warningStatus);
var violationSvg = '<span><svg width="28" xmlns="http://www.w3.org/2000/svg" height="40" viewBox="0 0 28 40"><g xmlns="http://www.w3.org/2000/svg" id="mandatory-constraint-violation" transform="translate(4 4)"><rect width="20" stroke="#000" rx="2" ry="2" height="32" fill="#ff3300"/><text id="lightning" x="10" y="15" text-anchor="middle">⚡</text><text id="violation-text" x="10" y="27" text-anchor="middle" font-size="11px">0</text></g></svg></span>';
var warningSvg = '<span><svg width="28" xmlns="http://www.w3.org/2000/svg" height="40" viewBox="0 0 28 40"><g xmlns="http://www.w3.org/2000/svg" id="non-mandatory-constraint-violation" transform="translate(4 4)"><rect width="20" stroke="#000" rx="2" ry="2" height="32" fill="#ffaa00"/><text id="exclamation" x="10" y="15" text-anchor="middle" >!</text><text id="warning-text" x="10" y="27" text-anchor="middle" font-size="11px">0</text></g></svg></span>';
var okSvg = '<span><svg width="28" xmlns="http://www.w3.org/2000/svg" height="40" viewBox="0 0 28 40"><g xmlns="http://www.w3.org/2000/svg" id="constraint-ok" transform="translate(4 4)"><rect width="20" stroke="#000" rx="2" ry="2" height="32" fill="#33ff33"/><text id="checkMark" x="10" y="15" text-anchor="middle">✓</text><text id="ok-text" x="10" y="27" text-anchor="middle" font-size="11px">0</text></g></svg></span>';
var anchor = '<a id="constraint-summary" style="vertical-align: bottom" href="https://www.wikidata.org/wiki/Special:ConstraintReport/' + this.entityID + '"></a>';
$( ".mw-indicators" ).append( $( anchor ) );
var title = "";
if (this.violation > 0) {
$("#constraint-summary").append( $( violationSvg ) );
$("#violation-text").text(this.violation);
title += "Constraint Violations: " + this.violation + "\n";
title += violationStatusString;
}
if (this.warning > 0) {
$("#constraint-summary").append( $( warningSvg ) );
$("#warning-text").text(this.warning);
title += "Constraint Warnings: " + this.warning + "\n";
title += warningStatusString;
}
if (this.violation === 0) {
if (this.warning === 0) {
$("#constraint-summary" ).append( $( okSvg ) );
title += "No constraint violations or warnings";
}
}
if (title !== "") {
$('#constraint-summary').prop('title', title);
}
}
if (entityID) {
$.ajax({
datatype: "json",
url: "https://www.wikidata.org/w/api.php?action=wbcheckconstraints&status=violation|warning&format=json&id=" + this.entityID
})
.done(function( data ) {
analyseJson(data);
})
.fail(function() {
console.log( 'The ajax request failed.' );
});
}