MinervaNeue/resources/skins.minerva.scripts/references.js
jdlrobson 71bf8604ab Move error handling inside Minerva
ReferenceDrawer
Instead of doing this inside the ReferenceDrawer component
itself, we'll do this here.

To be backwards compatible we check the value is truthy.
When I5a7b23f60722eb5017a85c68f38844dd460f8b63 is merged
this can be removed.

For NotificationBadge we pass the onError option which
is now available and allows us to clean up the NotificationBadge

Change-Id: I47db11fa945a05f3b2a9a43c3cf053ca489a38fa
2018-03-08 20:03:22 +00:00

120 lines
3.2 KiB
JavaScript

( function ( M, $ ) {
var drawer,
skin = M.require( 'skins.minerva.scripts/skin' ),
page = M.getCurrentPage(),
router = require( 'mediawiki.router' ),
util = M.require( 'mobile.startup/util' ),
ReferencesGateway = M.require( 'mobile.references.gateway/ReferencesGateway' ),
ReferencesMobileViewGateway = M.require(
'mobile.references.gateway/ReferencesMobileViewGateway'
),
referencesMobileViewGateway = ReferencesMobileViewGateway.getSingleton(),
ReferencesHtmlScraperGateway = M.require(
'mobile.references.gateway/ReferencesHtmlScraperGateway'
),
ReferencesDrawer = M.require( 'mobile.references/ReferencesDrawer' );
/**
* Creates a ReferenceDrawer based on the currently available
* ReferenceGateway
*
* @ignore
* @return {ReferencesDrawer}
*/
function referenceDrawerFactory() {
var gateway = null;
if ( mw.config.get( 'wgMFLazyLoadReferences', false ) ) {
gateway = referencesMobileViewGateway;
} else {
gateway = new ReferencesHtmlScraperGateway( new mw.Api() );
}
return new ReferencesDrawer( {
gateway: gateway
} );
}
/**
* Event handler to show reference when a reference link is clicked
* @ignore
* @param {jQuery.Event} ev Click event of the reference element
* @param {ReferencesDrawer} drawer to show the reference in
* @param {Page} page
*/
function showReference( ev, drawer, page ) {
var urlComponents, result,
$dest = $( ev.currentTarget ),
href = $dest.attr( 'href' );
ev.preventDefault();
// If necessary strip the URL portion of the href so we are left with the
// fragment
urlComponents = href.split( '#' );
if ( urlComponents.length > 1 ) {
href = '#' + urlComponents[1];
}
result = drawer.showReference( href, page, $dest.text() );
// Previously showReference method returns nothing so we check its truthy
// Can be removed when I5a7b23f60722eb5017a85c68f38844dd460f8b63 is merged.
if ( result ) {
result.then( util.noop, function ( err ) {
if ( err === ReferencesGateway.ERROR_NOT_EXIST ) {
router.navigate( href );
}
} );
}
// don't hide drawer (stop propagation of click) if it is already shown
// (e.g. click another reference)
if ( drawer.isVisible() ) {
ev.stopPropagation();
} else {
// flush any existing reference information
drawer.render( {
text: undefined
} );
}
}
/**
* Event handler to show reference when a reference link is clicked.
* Delegates to `showReference` once the references drawer is ready.
*
* @ignore
* @param {jQuery.Event} ev Click event of the reference element
*/
function onClickReference( ev ) {
if ( !drawer ) {
drawer = referenceDrawerFactory();
}
showReference( ev, drawer, ev.data.page );
}
/**
* Make references clickable and show a drawer when clicked on.
* @ignore
* @param {Page} page
*/
function setup( page ) {
var $refs = page.$( 'sup.reference a' );
if ( $refs.length ) {
$refs
.off( 'click' )
.on( 'click', {
page: page
}, onClickReference );
page.$( '.mw-cite-backlink a' )
.off( 'click' );
}
}
setup( page );
// When references are lazy loaded you'll want to take care of nested references
skin.on( 'references-loaded', function ( page ) {
setup( page );
} );
}( mw.mobileFrontend, jQuery ) );