MediaWiki:Gadget-DuplicateReferences.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.
/**
* Adds a link to copy references and add them to other statements on the same item.
*
* @see [[MediaWiki:Gadget-DuplicateReferences.css]]
* @author Bene*
*/
( function ( $, mw, wb ) {
'use strict';
if ( !mw.config.exists( 'wbEntityId' ) ||
!mw.config.get( 'wbIsEditView' ) ||
!mw.config.get( 'wgIsProbablyEditable' )
) {
return;
}
switch ( mw.config.get( 'wgUserLanguage' ) ) {
default:
case 'en':
mw.messages.set( {
'insert-reference': 'insert reference',
'copy': 'copy',
'saving': 'saving',
'copied': 'copied',
'insert-reference-failed': 'The reference could not be inserted.'
} );
break;
case 'ar':
mw.messages.set( {
'insert-reference': 'أدرج مرجعًا',
'copy': 'انسخ',
'saving': 'يحفظ',
'copied': 'نُسِخ',
'insert-reference-failed': 'المرجع غير قابل للإدارج.'
} );
break;
case 'cs':
mw.messages.set( {
'insert-reference': 'vložit referenci',
'copy': 'zkopírovat',
'saving': 'ukládám',
'copied': 'zkopírováno',
'insert-reference-failed': 'Referenci nebylo možné uložit.'
} );
break;
case 'de':
mw.messages.set( {
'insert-reference': 'Einzelnachweis einfügen',
'copy': 'kopieren',
'saving': 'speichern',
'copied': 'kopiert',
'insert-reference-failed': 'Der Einzelnachweis konnte nicht eingefügt werden.'
} );
break;
case 'el':
mw.messages.set( {
'insert-reference': 'προσθήκη παραπομπής',
'copy': 'αντιγραφή',
'saving': 'αποθηκεύεται',
'copied': 'αντιγράφτηκε',
'insert-reference-failed': 'αποτυχημένη προσθήκη παραπομπής.'
} );
break;
case 'fr':
mw.messages.set( {
'insert-reference': 'coller la référence',
'copy': 'copier',
'saving': 'enregistrement',
'copied': 'copiée',
'insert-reference-failed': 'La référence ne peut pas être collée.'
} );
break;
case 'it':
mw.messages.set( {
'insert-reference': 'inserisci riferimento',
'copy': 'copia',
'saving': 'salvataggio...',
'copied': 'copiato',
'insert-reference-failed': 'Non è stato possibile inserire il riferimento.'
} );
break;
case 'mk':
mw.messages.set( {
'insert-reference': 'вметни навод',
'copy': 'копирај',
'saving': 'зачувувам',
'copied': 'ископирано',
'insert-reference-failed': 'Не можев да го вметнам наводот.'
} );
break;
case 'nb':
mw.messages.set( {
'insert-reference': 'sett inn referanse',
'copy': 'kopier',
'saving': 'lagrer',
'copied': 'kopiert',
'insert-reference-failed': 'Referansen kunne ikke settes inn.'
} );
break;
case 'nn':
mw.messages.set( {
'insert-reference': 'sett inn referanse',
'copy': 'kopier',
'saving': 'lagrar',
'copied': 'kopiert',
'insert-reference-failed': 'Referansen kunne ikkje settast inn.'
} );
break;
case 'nl':
mw.messages.set( {
'insert-reference': 'bron invoegen',
'copy': 'kopiëren',
'saving': 'opslaan',
'copied': 'gekopieerd',
'insert-reference-failed': 'De bron kon niet ingevoegd worden.'
} );
break;
case 'pl':
mw.messages.set( {
'insert-reference': 'wstaw odniesienie',
'copy': 'kopiuj',
'saving': 'zapisywanie',
'copied': 'skopiowano',
'insert-reference-failed': 'Odniesienie nie mogło zostać wstawione.'
} );
break;
case 'sv':
mw.messages.set( {
'insert-reference': 'lägg in referens',
'copy': 'kopiera',
'saving': 'skapar',
'copied': 'kopierad',
'insert-reference-failed': 'kunde inte lägga in referens.'
} );
break;
}
var RevisionStore = function ( baseRev ) {
this._revisions = {
baseRevision: baseRev,
labelRevision: baseRev,
descriptionRevision: baseRev,
aliasesRevision: baseRev,
sitelinksRevision: {},
claimRevisions: {}
};
};
$.extend( RevisionStore.prototype, {
getBaseRevision: function () {
return this._revisions.baseRevision;
},
getLabelRevision: function () {
return this._revisions.labelRevision;
},
getDescriptionRevision: function () {
return this._revisions.descriptionRevision;
},
getAliasesRevision: function () {
return this._revisions.aliasesRevision;
},
getSitelinksRevision: function ( siteId ) {
if ( Object.prototype.hasOwnProperty.call( this._revisions.sitelinksRevision, siteId ) ) {
return this._revisions.sitelinksRevision[ siteId ];
}
return this._revisions.baseRevision;
},
getClaimRevision: function ( statementGuid ) {
if ( Object.prototype.hasOwnProperty.call( this._revisions.claimRevisions, statementGuid ) ) {
return this._revisions.claimRevisions[ statementGuid ];
}
return this._revisions.baseRevision;
},
setLabelRevision: function ( rev ) {
this._revisions.labelRevision = rev;
},
setDescriptionRevision: function ( rev ) {
this._revisions.descriptionRevision = rev;
},
setAliasesRevision: function ( rev ) {
this._revisions.aliasesRevision = rev;
},
setSitelinksRevision: function ( rev, siteId ) {
this._revisions.sitelinksRevision[ siteId ] = rev;
},
setClaimRevision: function ( rev, statementGuid ) {
this._revisions.claimRevisions[ statementGuid ] = rev;
}
} );
var entityPromise = $.Deferred( function ( deferred ) {
mw.hook( 'wikibase.entityPage.entityLoaded' ).add( function ( entity ) {
deferred.resolve( entity );
} );
} ).promise();
var entityInitializer = new wb.EntityInitializer( entityPromise );
var model = null;
entityInitializer.getEntity().then( function ( entity ) {
var repoConfig = mw.config.get( 'wbRepo' ),
repoApiUrl = repoConfig.url + repoConfig.scriptPath + '/api.php',
mwApi = wb.api.getLocationAgnosticMwApi( repoApiUrl ),
repoApi = new wb.api.RepoApi( mwApi ),
revisionStore = new RevisionStore(mw.config.get( 'wgCurRevisionId' ) ),
entityChangersFactory = new wb.entityChangers.EntityChangersFactory(
repoApi,
revisionStore,
entity
);
model = entityChangersFactory.getStatementsChanger();
} );
/*
/Create model
*/
var selectedReference = null;
function insertReference( statementview ) {
var deferred = $.Deferred();
if ( selectedReference !== null ) {
var statement = statementview.value();
try {
statement.getReferences().addItem( selectedReference );
} catch ( error ) {
mw.notify( error && error.getMessage ? error.getMessage() : error, {
title: mw.msg( 'insert-reference-failed' ),
type: 'error'
});
}
try {
model.save( statement ).then( function ( statement ) {
if ( !statementview._referencesListview ) {
statementview._createReferencesListview();
}
statementview._recreateReferences();
deferred.resolve();
}, function ( error ) {
mw.notify( error && error.getMessage ? error.getMessage() : error, {
title: mw.msg( 'insert-reference-failed' ),
type: 'error'
} );
deferred.resolve();
} );
} catch(error) {
// Not an instance of datamodel.StatementList
mw.notify( error && error.getMessage ? error.getMessage() : error, {
title: mw.msg( 'insert-reference-failed' ),
type: 'error'
} );
deferred.resolve();
}
}
return deferred.promise();
}
function selectReference( ref ) {
if(!ref) {
mw.log.error('Null argument passed to selectReference');
return;
}
selectedReference = ref;
selectedReference._hash = null; // set hash to null to create a new reference
if ( $( '.wikibase-toolbar-button-insert' ).length === 0 ) {
addInsertLinks();
}
}
function addInsertLinks() {
// [insert reference]
$( '.wikibase-statementview-references .wikibase-toolbar-button-add' ).after(
$( '<span>' )
.addClass( 'wikibase-toolbarbutton wikibase-toolbar-item wikibase-toolbar-button wikibase-toolbar-button-insert' )
.append(
$( '<a>' )
.attr( 'href', '#' )
.text( mw.msg( 'insert-reference' ) )
.prepend( $( '<span>' ).addClass( 'wb-icon' ) )
.click( function ( e ) {
e.preventDefault();
var $this = $( this ),
$parent = $this.parent();
if ( !$parent.hasClass( 'wikibase-toolbarbutton-disabled' ) ) {
$parent.addClass( 'wikibase-toolbarbutton-disabled ui-state-disabled' );
$this.text( mw.msg( 'saving' ) ).prepend( $( '<span>' ).addClass( 'wb-icon' ) );
var statementview = $this.parents( '.wikibase-statementview' ).data( 'statementview' );
insertReference( statementview ).then( function () {
$parent.removeClass( 'wikibase-toolbarbutton-disabled ui-state-disabled' );
$this.text( mw.msg( 'insert-reference' ) ).prepend( $( '<span>' ).addClass( 'wb-icon' ) );
} );
}
} )
)
);
}
function addCopyLinks( element ) {
//hide existing items
$( element ).find( '.wikibase-referenceview-heading' ).find( '.wikibase-toolbar-item' ).hide();
// [copy]
$( element ).find( '.wikibase-referenceview-heading' ).append(
$( '<div>' )
.addClass( 'wikibase-copytoolbar-container wikibase-toolbar-container' )
.append(
$( '<span>' )
.addClass( 'wikibase-toolbarbutton wikibase-toolbar-item wikibase-toolbar-button wikibase-toolbar-button-copy' )
.append(
$( '<a>' )
.attr( 'href', '#' )
.text( mw.msg( 'copy' ) )
.prepend( $( '<span>' ).addClass( 'wb-icon' ) )
.click( function ( e ) {
e.preventDefault();
var $this = $( this ),
$parent = $this.parent();
if ( !$parent.hasClass( 'wikibase-toolbarbutton-disabled' ) ) {
$( '.wikibase-toolbar-button-copy' )
.removeClass( 'wikibase-toolbarbutton-disabled ui-state-disabled' )
.find( 'a' )
.text( mw.msg( 'copy' ) )
.prepend( $( '<span>' ).addClass( 'wb-icon' ) );
$parent.addClass( 'wikibase-toolbarbutton-disabled ui-state-disabled' );
$this.text( mw.msg( 'copied' ) ).prepend( $( '<span>' ).addClass( 'wb-icon' ) );
var hash = $this.closest( '.wikibase-referenceview' )[ 0 ].className.match( /wikibase-referenceview-([0-9a-z]+)/ )[ 1 ];
var statement = $this.closest( '.wikibase-statementview' ).data( 'wikibase-statementview' ).value();
selectReference( statement.getReferences().toArray().filter( function ( v ) { return v.getHash() === hash } )[ 0 ] );
}
} )
)
)
);
}
$( function () {
addCopyLinks( '.wikibase-statementview' );
// remove [copy] when entering edit mode to avoid clashes
$( document )
.on( 'snakviewafterstartediting', function ( e ) {
setTimeout( function () {
$( e.target ).find( '.wikibase-referenceview-heading' ).find( '.wikibase-copytoolbar-container' ).remove();
// show existing items
$( e.target ).find( '.wikibase-referenceview-heading' ).find( '.wikibase-toolbar-item' ).show();
}, 50 );
} )
.on( 'snakviewafterstopediting', function ( e ) {
var element = $( e.target ).parents( '.wikibase-statementview' );
// ugly hack but there seems to be no proper event to add this
setTimeout( function () {
addCopyLinks( element );
}, 50 );
} );
} );
} )( jQuery, mediaWiki, wikibase );