User:Teester/ConstraintSummary.js

From Wikidata
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.' );
	});
}