User:Ricordisamoa/SetGender.js

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.
/* <nowiki>
 *
 * SetGender.js by [[User:Ricordisamoa]]
 * simplifies adding Male/Female to a Wikidata element
*/
$( document ).ready( function () {
	// only on entities, in 'view' mode
	if ( mw.config.get( 'wgAction' ) !== 'view' ) {
		return;
	}
	mw.hook( 'wikibase.entityPage.entityLoaded' ).add( function ( entity ) {
		var genderProp = 'P21';
		if ( entity.claims && entity.claims[genderProp] && entity.claims[genderProp].length > 1 ) {
			// more than 1 gender?!?
			return;
		}
		var genders = {
			male: {
				id: 6581097,
				img: '//upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Mars-male-symbol-pseudo-3D-blue.svg/55px-Mars-male-symbol-pseudo-3D-blue.svg.png'
			},
			female: {
				id: 6581072,
				img: '//upload.wikimedia.org/wikipedia/commons/thumb/2/24/Venus-female-symbol-pseudo-3D-pink.svg/40px-Venus-female-symbol-pseudo-3D-pink.svg.png'
			}
		},
		api = new mw.Api(),
		currentGender;
		if ( entity.claims[genderProp] ) {
			var claim = entity.claims[genderProp][0];
			if (
				claim.mainsnak &&
				claim.mainsnak.datavalue &&
				claim.mainsnak.datavalue.value &&
				claim.mainsnak.datavalue.value['numeric-id']
			) {
				currentGender = claim;
			}
		}
		var setGender = function ( gender ) {
			if ( genders[gender] === undefined ) {
				// prevent unknown genders from being set
				return;
			}
			var value = {
				'entity-type': 'item',
				'numeric-id': genders[gender].id
			},
			params = {
				entity: mw.config.get( 'wbEntityId' ),
				snaktype: 'value',
				value: JSON.stringify( value ),
				summary: '[[Wikidata:Tools#SetGender.js|SetGender.js]]: set gender to [[Q' + genders[gender].id + '|' + gender + ']]'
			};
			if ( currentGender ) {
				params.action = 'wbsetclaimvalue';
				params.claim = currentGender.id;
			} else {
				params.action = 'wbcreateclaim';
				params.property = genderProp;
			}
			api.postWithToken( 'edit', params )
			.done( function () {
				document.location.reload();
			} )
			.fail( function () {
				mw.notify( 'SetGender.js: Error' );
			} );
		},
		$div = $( '<div>' ).css( 'float', 'right' );
		$.each( genders, function ( name, dict ) {
			var selected = (
				currentGender &&
				dict.id === currentGender.mainsnak.datavalue.value['numeric-id']
			),
			attrs = {
				'aria-selected': selected
			};
			if ( !selected ) {
				attrs.href = '#';
				attrs.title = "set '" + name + "' as this element's gender";
			}
			var $button = $( '<img>' )
			.attr( 'src', dict.img )
			.wrap( '<a>' ).parent()
			.attr( attrs )
			.css( 'marginLeft', '0.5em' );
			if ( !selected ) {
				$button
				.css( 'opacity', 0.5 )
				.click( function ( event ) {
					event.preventDefault();
					setGender( name );
				} );
			}
			$button.appendTo( $div );
		} );
		$div.prependTo( '.wikibase-entityview' );
	} );
} );