Merge "Add framework for file warnings"

This commit is contained in:
jenkins-bot 2015-03-18 17:25:20 +00:00 committed by Gerrit Code Review
commit 524d92b61f
6 changed files with 147 additions and 3 deletions

View file

@ -245,11 +245,11 @@ abstract class ImageHandler extends MediaHandler {
if ( $pages === false || $pages <= 1 ) {
$msg = wfMessage( 'file-info-size' )->numParams( $file->getWidth(),
$file->getHeight() )->params( $size,
$file->getMimeType() )->parse();
'<span class="mime-type">' . $file->getMimeType() . '</span>' )->parse();
} else {
$msg = wfMessage( 'file-info-size-pages' )->numParams( $file->getWidth(),
$file->getHeight() )->params( $size,
$file->getMimeType() )->numParams( $pages )->parse();
'<span class="mime-type">' . $file->getMimeType() . '</span>' )->numParams( $pages )->parse();
}
return $msg;

View file

@ -639,7 +639,7 @@ abstract class MediaHandler {
*/
static function getGeneralLongDesc( $file ) {
return wfMessage( 'file-info' )->sizeParams( $file->getSize() )
->params( $file->getMimeType() )->parse();
->params( '<span class="mime-type">' . $file->getMimeType() . '</span>' )->parse();
}
/**
@ -861,4 +861,26 @@ abstract class MediaHandler {
public function sanitizeParamsForBucketing( $params ) {
return $params;
}
/**
* Gets configuration for the file warning message. Return value of
* the following structure:
* array(
* 'module' => 'example.filewarning.messages', // Required, module with messages loaded for the client
* 'messages' => array( // Required, array of names of messages
* 'main' => 'example-filewarning-main', // Required, main warning message
* 'header' => 'example-filewarning-header', // Optional, header for warning dialog
* 'footer' => 'example-filewarning-footer', // Optional, footer for warning dialog
* 'info' => 'example-filewarning-info', // Optional, text for more-information link (see below)
* ),
* 'link' => 'http://example.com', // Optional, link for more information
* )
*
* Returns null if no warning is necessary.
* @param File $file
* @return array|null
*/
public function getWarningConfig( $file ) {
return null;
}
}

View file

@ -505,6 +505,22 @@ class ImagePage extends Article {
$longDesc = $this->getContext()->msg( 'parentheses', $this->displayImg->getLongDesc() )->text();
$handler = $this->displayImg->getHandler();
// If this is a filetype with potential issues, warn the user.
if ( $handler ) {
$warningConfig = $handler->getWarningConfig( $this->displayImg );
if ( $warningConfig !== null ) {
// The warning will be displayed via CSS and JavaScript.
// We just need to tell the client side what message to use.
$output = $this->getContext()->getOutput();
$output->addJsConfigVars( 'wgFileWarning', $warningConfig );
$output->addModules( $warningConfig['module'] );
$output->addModules( 'mediawiki.filewarning' );
}
}
$medialink = "[[Media:$filename|$linktext]]";
if ( !$this->displayImg->isSafeFile() ) {

View file

@ -892,6 +892,15 @@ return array(
'feedback-useragent'
),
),
'mediawiki.filewarning' => array(
'scripts' => 'resources/src/mediawiki/mediawiki.filewarning.js',
'styles' => 'resources/src/mediawiki/mediawiki.filewarning.less',
'dependencies' => array(
'oojs-ui',
),
),
'mediawiki.helplink' => array(
'styles' => array(
'resources/src/mediawiki/mediawiki.helplink.css',

View file

@ -0,0 +1,68 @@
/*!
* mediawiki.filewarning
*
* @author Mark Holmquist, 2015
* @since 1.25
*/
/*global OO*/
( function ( mw, $, oo ) {
var warningConfig = mw.config.get( 'wgFileWarning' ),
warningMessages = warningConfig.messages,
warningLink = warningConfig.link,
$origMimetype = $( '.fullMedia .fileInfo .mime-type' ),
$mimetype = $origMimetype.clone(),
$header = $( '<h3>' )
.addClass( 'mediawiki-filewarning-header empty' ),
$main = $( '<p>' )
.addClass( 'mediawiki-filewarning-main empty' ),
$info = $( '<a>' )
.addClass( 'mediawiki-filewarning-info empty' ),
$footer = $( '<p>' )
.addClass( 'mediawiki-filewarning-footer empty' ),
dialog = new oo.ui.PopupButtonWidget( {
classes: [ 'mediawiki-filewarning-anchor' ],
label: $mimetype,
flags: [ 'warning' ],
icon: 'alert',
framed: false,
popup: {
classes: [ 'mediawiki-filewarning' ],
padded: true,
width: 400,
$content: $header.add( $main ).add( $info ).add( $footer )
}
} );
function loadMessage( $target, message ) {
if ( message ) {
$target.removeClass( 'empty' )
.text( mw.message( message ).text() );
}
}
// The main message must be populated for the dialog to show.
if ( warningConfig && warningConfig.messages && warningConfig.messages.main ) {
$mimetype.addClass( 'has-warning' );
$origMimetype.replaceWith( dialog.$element );
if ( warningMessages ) {
loadMessage( $main, warningMessages.main );
loadMessage( $header, warningMessages.header );
loadMessage( $footer, warningMessages.footer );
if ( warningLink ) {
loadMessage( $info, warningMessages.info );
$info.attr( 'href', warningLink );
}
}
// Make OOUI open the dialog, it won't appear until the user
// hovers over the warning.
dialog.getPopup().toggle( true );
// Override toggle handler because we don't need it for this popup
// object at all. Sort of nasty, but it gets the job done.
dialog.getPopup().toggle = $.noop;
}
}( mediaWiki, jQuery, OO ) );

View file

@ -0,0 +1,29 @@
@import "mediawiki.ui/variables"
.mediawiki-filewarning {
display: none;
.mediawiki-filewarning-header {
padding: 0;
font-weight: 600;
}
.mediawiki-filewarning-footer {
color: #888888;
}
.empty {
display: none;
}
.mediawiki-filewarning-anchor:hover & {
display: block;
}
}
.mime-type {
&.has-warning {
font-weight: bold;
color: @colorMediumSevere;
}
}