User:Matěj Suchánek/qualifierSuggestions.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)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
( function( mw, wb ) {

	var api, repoApi;
	var promise = null;
	const PROPS = [ 'P580', 'P582', 'P585' ];

	function isQualifierContext( element ) {
		// From https://gerrit.wikimedia.org/g/mediawiki/extensions/PropertySuggester/+/533214fcb72210ccf6ca84848bd0fb37334c5d05/modules/PropertySuggester.js#129
		var $statementview = element.closest( ':wikibase-statementview' ),
			statementview = $statementview.data( 'statementview' );

		return statementview ? element.closest( statementview.$qualifiers ).length > 0 : false;
	}

	function getPromise() {
		if ( promise === null ) {
			const lang = mw.config.get( 'wgUserLanguage' ),
				path = mw.config.get( 'wgServer' ) + mw.config.get( 'wgArticlePath' );
			promise = api.get( {
				action: 'wbgetentities',
				ids: repoApi.normalizeMultiValue( PROPS ),
				props: repoApi.normalizeMultiValue( [ 'labels', 'descriptions' ] ),
				languages: lang,
				languagefallback: 1,
			} )
			.then( function ( data ) {
				return PROPS.map( function ( p ) {
					const entity = data.entities[ p ];
					return {
						id: p,
						display: {
							label: entity.labels[ lang ],
							description: entity.descriptions[ lang ]
						},
						rating: 1,
						url: path.replace( '$1', 'Property:' + p ),
					};
				} );
			} );
		}
		return promise;
	}

	mw.loader.using( [ 'mediawiki.api', 'wikibase.api.RepoApi' ] ).then( function () {
		api = new mw.Api();
		repoApi = new wb.api.RepoApi( api );
		mw.hook( 'wikibase.entityselector.search' ).add( function ( data, addPromise ) {
			if ( data.options.type !== 'property' ) {
				return;
			}
			if ( data.term !== '' ) {
				return;
			}
			if ( !isQualifierContext( data.element ) ) {
				return;
			}
			addPromise( getPromise() );
		} );
	} );

} )( mediaWiki, wikibase );