mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/RelatedArticles
synced 2024-12-25 06:13:25 +00:00
e5431a1c0b
We currently require support for IntersectionObserver. which is supported on Edge >= 15 (15 has partial support), Firefox >55, Chrome >58, Safari 12.1, Opera >=38, iOS Safari >=12.2, Android 100 Full ES6 is supported in Edge >=15, Firefox >=54, Chrome >=51, Safari >=10, Opera >=38, iOS Safari >=10, so such a change would only drop support for Edge 15 and Firefox 54. CSS.escape is guaranteed in all these browsers according to caniuse, with the only discrepancy being the Edge browser (versions 16-18) so it is also suggested we remove support for those browsers. Firefox 54 accounts for 0.0026% of page views Edge 15-18 accounts for 0.069% of page views Bug: T306355 Change-Id: Id2987e3456607b610c38da9ee157a026d1d00ada
86 lines
1.8 KiB
JavaScript
86 lines
1.8 KiB
JavaScript
/* eslint-disable no-underscore-dangle */
|
|
'use strict';
|
|
|
|
/**
|
|
* Renders a Card model and updates when it does.
|
|
*
|
|
* @class mw.cards.CardView
|
|
* @param {mw.cards.CardModel} model
|
|
*/
|
|
function CardView( model ) {
|
|
/**
|
|
* @property {mw.cards.CardModel}
|
|
*/
|
|
this.model = model;
|
|
|
|
// listen to model changes and re-render the view
|
|
this.model.on( 'change', this.render.bind( this ) );
|
|
|
|
/**
|
|
* @property {jQuery}
|
|
*/
|
|
this.$el = $( this._render() );
|
|
}
|
|
OO.initClass( CardView );
|
|
|
|
/**
|
|
* Replace the html of this.$el with a newly rendered html using the model
|
|
* attributes.
|
|
*/
|
|
CardView.prototype.render = function () {
|
|
this.$el.replaceWith( this._render() );
|
|
};
|
|
|
|
/**
|
|
* Renders the template using the model attributes.
|
|
*
|
|
* @ignore
|
|
* @return {string}
|
|
*/
|
|
CardView.prototype._render = function () {
|
|
const $listItem = $( '<li>' ),
|
|
attributes = $.extend( {}, this.model.attributes );
|
|
|
|
attributes.thumbnailUrl = CSS.escape( attributes.thumbnailUrl );
|
|
|
|
$listItem.attr( {
|
|
title: attributes.title,
|
|
class: 'ext-related-articles-card'
|
|
} );
|
|
|
|
$listItem.append(
|
|
$( '<div>' )
|
|
.addClass( 'ext-related-articles-card-thumb' )
|
|
.addClass( attributes.hasThumbnail ?
|
|
'' :
|
|
'ext-related-articles-card-thumb-placeholder'
|
|
)
|
|
.css( 'background-image', attributes.hasThumbnail ?
|
|
'url(' + attributes.thumbnailUrl + ')' :
|
|
null
|
|
),
|
|
$( '<a>' )
|
|
.attr( {
|
|
href: attributes.url,
|
|
'aria-hidden': 'true',
|
|
tabindex: -1
|
|
} ),
|
|
$( '<div>' )
|
|
.attr( { class: 'ext-related-articles-card-detail' } )
|
|
.append(
|
|
$( '<h3>' ).append(
|
|
$( '<a>' )
|
|
.attr( { href: attributes.url } )
|
|
.text( attributes.title )
|
|
),
|
|
$( '<p>' )
|
|
.attr( { class: 'ext-related-articles-card-extract' } )
|
|
.text( attributes.extract )
|
|
)
|
|
);
|
|
|
|
return $listItem;
|
|
};
|
|
|
|
module.exports = CardView;
|