-
Notifications
You must be signed in to change notification settings - Fork 9
/
RevisionPopupWidget.js
154 lines (137 loc) · 4.69 KB
/
RevisionPopupWidget.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import Tools from './Tools';
/**
* @class
* @constructor
*/
const RevisionPopupWidget = function RevisionPopupWidget() {
this.$popupContent = $( '<div>' )
.addClass( 'ext-wwt-revisionPopupWidget-content' );
// Parent constructor
RevisionPopupWidget.parent.call( this, {
padded: true,
autoClose: true,
position: 'above',
// FIXME: 'force-left' for RTL languages
align: 'force-right',
hideWhenOutOfView: false,
$content: this.$popupContent
} );
};
/* Setup */
OO.inheritClass( RevisionPopupWidget, OO.ui.PopupWidget );
/**
* Get markup for the diff size.
* @param {number} size
* @return {string}
*/
function getSizeHtml( size ) {
let sizeClass;
if ( size > 0 ) {
sizeClass = 'mw-plusminus-pos';
} else if ( size < 0 ) {
sizeClass = 'mw-plusminus-neg';
} else {
sizeClass = 'mw-plusminus-null';
}
return `
<span class="${sizeClass} mw-diff-bytes">` +
`${size > 0 ? '+' : ''}${mw.language.convertNumber( size )}` +
'</span>';
}
/**
* Get markup for the edit summary.
* @param {Object} data As returned by Api.prototype.getTokenInfo().
* @return {string}
*/
function getCommentHtml( data ) {
if ( data.comment === '' ) {
// No edit summary.
return '';
} else if ( data.comment === undefined ) {
// Not yet available.
return `
<div class="ext-wwt-revisionPopupWidget-comment">
<div class="ext-wwt-shimmer ext-www-shimmer-animation"></div>
<div class="ext-wwt-shimmer ext-www-shimmer-animation"></div>
</div>`;
}
return `
<div class="ext-wwt-revisionPopupWidget-comment ext-wwt-revisionPopupWidget-comment-transparent">
<span class="comment comment--without-parentheses ext-wwt-revisionPopupWidget-comment">${Tools.bidiIsolate( data.comment, true )}</span>
${getSizeHtml( data.size )}
</div>`;
}
/**
* Get jQuery objects for the user links.
* @param {Object} data As returned by Api.prototype.getTokenInfo().
* @return {jQuery}
*/
function getUserLinksHtml( data ) {
const contribsUrl = mw.util.getUrl( `Special:Contributions/${data.username}` ),
// We typically link to Special:Contribs for IPs.
userPageUrl = data.isIP ? contribsUrl : mw.util.getUrl( `User:${data.username}` );
if ( !data.username ) {
// Username was apparently suppressed.
return $( '<span>' )
.addClass( 'history-deleted' )
// Note we can't use the native MediaWiki 'rev-deleted-user'
// message because it can include parser functions.
.text( mw.msg( 'ext-whowrotethat-revision-deleted-username' ) );
}
return $( [] )
.add(
$( '<a>' )
.attr( 'href', userPageUrl )
.append( Tools.bidiIsolate( data.username ) )
)
.add( document.createTextNode( ' ' + mw.msg( 'parentheses-start' ) ) )
.add(
// Talk page
$( '<a>' )
.attr( 'href', mw.util.getUrl( `User talk:${data.username}` ) )
.text( mw.msg( 'talkpagelinktext' ) )
)
.add( document.createTextNode( ' ' + mw.msg( 'pipe-separator' ) + ' ' ) )
.add(
$( '<a>' )
.attr( 'href', contribsUrl )
.text( mw.msg( 'contribslink' ) )
)
.add( document.createTextNode( mw.msg( 'parentheses-end' ) ) );
}
/**
* Show the revision popup based on the given token data, above the given element.
* Note that the English namespaces will normalize to the wiki's local namespaces.
* @param {Object} data As returned by Api.prototype.getTokenInfo().
* @param {jQuery} $target Element the popup should be attached to.
*/
RevisionPopupWidget.prototype.show = function ( data, $target ) {
const $userLinks = getUserLinksHtml( data ),
dateStr = moment( data.revisionTime ).locale( mw.config.get( 'wgUserLanguage' ) ).format( 'LLL' ),
// Use jQuery to make sure attributes are properly escaped
$diffLink = $( '<a>' )
.attr( 'href', mw.util.getUrl( `Special:Diff/${data.revisionId}` ) )
.text( dateStr ),
addedMsg = mw.message( 'ext-whowrotethat-revision-added', $userLinks, $diffLink ).parse(),
scoreMsgKey = Number( data.score ) >= 1 ? 'ext-whowrotethat-revision-attribution' : 'ext-whowrotethat-revision-attribution-lessthan',
attributionMsg = `<div class="ext-wwt-revisionPopupWidget-attribution">${mw.message( scoreMsgKey, data.score ).parse()}</div>`,
html = $.parseHTML( `
${addedMsg.trim()}
${getCommentHtml( data )}
${attributionMsg}
` );
this.$popupContent.html( html );
if ( $target.find( '.thumb' ).length ) {
$target = $target.find( '.thumb' );
}
// Make sure all links in the popup (including in the edit summary) open in new tabs.
this.$popupContent.find( 'a' )
.attr( 'target', '_blank' );
this.setFloatableContainer( $target );
this.toggle( true );
// Animate edit summary, if present.
if ( data.comment ) {
$( '.ext-wwt-revisionPopupWidget-comment' ).removeClass( 'ext-wwt-revisionPopupWidget-comment-transparent' );
}
};
export default RevisionPopupWidget;