User:Ricordisamoa/SetGender.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)
- Edge: Hold Ctrl while clicking Refresh, or 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' );
} );
} );