MediaWiki:Common.js: Difference between revisions

No edit summary
No edit summary
Line 233: Line 233:


function normalize( data ) {
function normalize( data ) {
if ( Array.isArray( data ) ) {
if ( Array.isArray( data ) ) {
return data;
return {
}
pins: data,
if ( data && Array.isArray( data.pins ) ) {
categories: {}
return data.pins;
};
}
}
return [];
if ( data && Array.isArray( data.pins ) ) {
return {
pins: data.pins,
categories: data.categories || {}
};
}
}
return {
pins: [],
categories: {}
};
}


function fetchMarkers( src ) {
function fetchMarkers( src ) {
Line 265: Line 274:
'<circle cx="12" cy="11.2" r="4.2" fill="#fff" fill-opacity=".92"/></svg>';
'<circle cx="12" cy="11.2" r="4.2" fill="#fff" fill-opacity=".92"/></svg>';


function buildPin( p ) {
function buildPin( p, categories ) {
var pin = document.createElement( p.page ? 'a' : 'span' );
var category = categories && p.category ? categories[p.category] : null;
var color = p.color || ( category && category.color );
 
var pin = document.createElement( p.page ? 'a' : 'span' );
pin.className = 'imap-pin';
pin.className = 'imap-pin';
if ( p.page ) {
if ( p.page ) {
pin.href = articleUrl( p.page );
pin.href = articleUrl( p.page );
}
}
if ( p.color ) {
if ( color ) {
pin.style.setProperty( '--pin-color', p.color );
pin.style.setProperty( '--pin-color', color );
}
}
pin.setAttribute( 'aria-label', p.title || p.page || 'map location' );
pin.setAttribute( 'aria-label', p.title || p.page || 'map location' );
pin.innerHTML = PIN_SVG;
pin.innerHTML = PIN_SVG;
Line 302: Line 314:


// Add every marker; return a list we can show / hide by zoom.
// Add every marker; return a list we can show / hide by zoom.
function addMarkers( viewer, markers ) {
function addMarkers( viewer, markers, categories ) {
var ti = viewer.world.getItemAt( 0 );
var ti = viewer.world.getItemAt( 0 );
var tracked = [];
var tracked = [];
Line 312: Line 324:
return;
return;
}
}
var built = ( p.kind === 'label' ) ? buildLabel( p ) : buildPin( p );
var built = ( p.kind === 'label' ) ? buildLabel( p ) : buildPin( p, categories );
viewer.addOverlay( {
viewer.addOverlay( {
element: built.element,
element: built.element,
Line 420: Line 432:
enableCoordHelper( viewer, el );
enableCoordHelper( viewer, el );
}
}
fetchMarkers( markersSrc ).then( function ( markers ) {
fetchMarkers( markersSrc ).then( function ( markerData ) {
var tracked = addMarkers( viewer, markers );
var tracked = addMarkers( viewer, markerData.pins, markerData.categories );
var update = makeVisibilityUpdater( viewer, tracked );
var update = makeVisibilityUpdater( viewer, tracked );
update(); // set the correct state for the starting zoom
update(); // set the correct state for the starting zoom