From d0c31ac98888876453c75281c03fdf6db65c00e8 Mon Sep 17 00:00:00 2001 From: Sethakill Date: Wed, 4 May 2016 21:23:04 +0200 Subject: [PATCH] Convert Special:AllMessages to use OOUI Moved form from pager and added new HTMLSelectLanguageField. Bug: T117749 Bug: T134425 Change-Id: I46dc6cc8f7ddf8552a726202df136cbbff66588c --- autoload.php | 1 + includes/htmlform/HTMLForm.php | 1 + includes/htmlform/HTMLSelectLanguageField.php | 34 +++++ includes/specials/SpecialAllMessages.php | 81 +++++++++-- .../specials/pagers/AllMessagesTablePager.php | 131 +++++------------- 5 files changed, 136 insertions(+), 112 deletions(-) create mode 100644 includes/htmlform/HTMLSelectLanguageField.php diff --git a/autoload.php b/autoload.php index 6a5a9dfc45..271385784f 100644 --- a/autoload.php +++ b/autoload.php @@ -603,6 +603,7 @@ $wgAutoloadLocalClasses = [ 'HTMLRestrictionsField' => __DIR__ . '/includes/htmlform/fields/HTMLRestrictionsField.php', 'HTMLSelectAndOtherField' => __DIR__ . '/includes/htmlform/fields/HTMLSelectAndOtherField.php', 'HTMLSelectField' => __DIR__ . '/includes/htmlform/fields/HTMLSelectField.php', + 'HTMLSelectLanguageField' => __DIR__ . '/includes/htmlform/HTMLSelectLanguageField.php', 'HTMLSelectLimitField' => __DIR__ . '/includes/htmlform/fields/HTMLSelectLimitField.php', 'HTMLSelectNamespace' => __DIR__ . '/includes/htmlform/fields/HTMLSelectNamespace.php', 'HTMLSelectNamespaceWithButton' => __DIR__ . '/includes/htmlform/fields/HTMLSelectNamespaceWithButton.php', diff --git a/includes/htmlform/HTMLForm.php b/includes/htmlform/HTMLForm.php index 1a7f8500d2..44e703b7a8 100644 --- a/includes/htmlform/HTMLForm.php +++ b/includes/htmlform/HTMLForm.php @@ -159,6 +159,7 @@ class HTMLForm extends ContextSource { 'checkmatrix' => HTMLCheckMatrix::class, 'cloner' => HTMLFormFieldCloner::class, 'autocompleteselect' => HTMLAutoCompleteSelectField::class, + 'language' => HTMLSelectLanguageField::class, 'date' => HTMLDateTimeField::class, 'time' => HTMLDateTimeField::class, 'datetime' => HTMLDateTimeField::class, diff --git a/includes/htmlform/HTMLSelectLanguageField.php b/includes/htmlform/HTMLSelectLanguageField.php new file mode 100644 index 0000000000..5d2019c7a6 --- /dev/null +++ b/includes/htmlform/HTMLSelectLanguageField.php @@ -0,0 +1,34 @@ +mParent instanceof HTMLForm ) { + $config = $this->mParent->getConfig(); + $languageCode = $config->get( 'LanguageCode' ); + } else { + global $wgLanguageCode; + $languageCode = $wgLanguageCode; + } + + $languages = Language::fetchLanguageNames( null, 'mw' ); + + // Make sure the site language is in the list; + // a custom language code might not have a defined name… + if ( !array_key_exists( $languageCode, $languages ) ) { + $languages[$languageCode] = $languageCode; + } + + foreach ( $languages as $code => $name ) { + $this->mParams['options'][$code . ' - ' . $name] = $code; + } + + if ( !array_key_exists( 'default', $params ) ) { + $this->mParams['default'] = $languageCode; + } + } +} diff --git a/includes/specials/SpecialAllMessages.php b/includes/specials/SpecialAllMessages.php index 9e66447fe3..2482d740b9 100644 --- a/includes/specials/SpecialAllMessages.php +++ b/includes/specials/SpecialAllMessages.php @@ -20,6 +20,7 @@ * @file * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; /** * Use this special page to get a list of the MediaWiki system messages. @@ -28,10 +29,6 @@ * @ingroup SpecialPage */ class SpecialAllMessages extends SpecialPage { - /** - * @var AllMessagesTablePager - */ - protected $table; public function __construct() { parent::__construct( 'Allmessages' ); @@ -43,7 +40,6 @@ class SpecialAllMessages extends SpecialPage { * @param string $par Parameter passed to the page or null */ public function execute( $par ) { - $request = $this->getRequest(); $out = $this->getOutput(); $this->setHeaders(); @@ -54,18 +50,77 @@ class SpecialAllMessages extends SpecialPage { return; } - $this->outputHeader( 'allmessagestext' ); $out->addModuleStyles( 'mediawiki.special' ); $this->addHelpLink( 'Help:System message' ); - $this->table = new AllMessagesTablePager( - $this, - [], - wfGetLangObj( $request->getVal( 'lang', $par ) ) - ); + $contLang = MediaWikiServices::getInstance()->getContentLanguage()->getCode(); + $lang = $this->getLanguage(); + + $opts = new FormOptions(); + + $opts->add( 'prefix', '' ); + $opts->add( 'filter', 'all' ); + $opts->add( 'lang', $contLang ); + $opts->add( 'limit', 50 ); + + $opts->fetchValuesFromRequest( $this->getRequest() ); + $opts->validateIntBounds( 'limit', 0, 5000 ); + + $pager = new AllMessagesTablePager( $this->getContext(), $opts ); + + $formDescriptor = [ + 'prefix' => [ + 'type' => 'text', + 'name' => 'prefix', + 'label-message' => 'allmessages-prefix', + ], + + 'filter' => [ + 'type' => 'radio', + 'name' => 'filter', + 'label-message' => 'allmessages-filter', + 'options' => [ + $this->msg( 'allmessages-filter-unmodified' )->text() => 'unmodified', + $this->msg( 'allmessages-filter-all' )->text() => 'all', + $this->msg( 'allmessages-filter-modified' )->text() => 'modified', + ], + 'default' => 'all', + 'flatlist' => true, + ], + + 'lang' => [ + 'type' => 'language', + 'name' => 'lang', + 'label-message' => 'allmessages-language', + 'default' => $opts->getValue( 'lang' ), + ], + + 'limit' => [ + 'type' => 'limitselect', + 'name' => 'limit', + 'label-message' => 'table_pager_limit_label', + 'options' => [ + $lang->formatNum( 20 ) => 20, + $lang->formatNum( 50 ) => 50, + $lang->formatNum( 100 ) => 100, + $lang->formatNum( 250 ) => 250, + $lang->formatNum( 500 ) => 500, + $lang->formatNum( 5000 ) => 5000, + ], + 'default' => $opts->getValue( 'limit' ), + ], + ]; + + $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() ); + $htmlForm + ->setMethod( 'get' ) + ->setIntro( $this->msg( 'allmessagestext' ) ) + ->setWrapperLegendMsg( 'allmessages' ) + ->setSubmitTextMsg( 'allmessages-filter-submit' ) + ->prepareForm() + ->displayForm( false ); - $out->addHTML( $this->table->buildForm() ); - $out->addParserOutputContent( $this->table->getFullOutput() ); + $out->addParserOutputContent( $pager->getFullOutput() ); } protected function getGroupName() { diff --git a/includes/specials/pagers/AllMessagesTablePager.php b/includes/specials/pagers/AllMessagesTablePager.php index e3c0d6da0d..26c2c508cf 100644 --- a/includes/specials/pagers/AllMessagesTablePager.php +++ b/includes/specials/pagers/AllMessagesTablePager.php @@ -30,9 +30,20 @@ use Wikimedia\Rdbms\FakeResultWrapper; */ class AllMessagesTablePager extends TablePager { - protected $filter, $prefix, $langcode, $displayPrefix; + /** + * @var string + */ + protected $langcode; + + /** + * @var bool + */ + protected $foreign; - public $mLimitsShown; + /** + * @var string + */ + protected $prefix; /** * @var Language @@ -44,41 +55,40 @@ class AllMessagesTablePager extends TablePager { */ public $custom; - public function __construct( $page, $conds, Language $langObj = null ) { - parent::__construct( $page->getContext() ); + /** + * @param IContextSource|null $context + * @param FormOptions $opts + */ + public function __construct( IContextSource $context = null, FormOptions $opts ) { + parent::__construct( $context ); + $this->mIndexField = 'am_title'; - $this->mPage = $page; - $this->mConds = $conds; // FIXME: Why does this need to be set to DIR_DESCENDING to produce ascending ordering? $this->mDefaultDirection = IndexPager::DIR_DESCENDING; - $this->mLimitsShown = [ 20, 50, 100, 250, 500, 5000 ]; - - $this->talk = $this->msg( 'talkpagelinktext' )->escaped(); + $langObj = wfGetLangObj( $opts->getValue( 'lang' ) ); $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $this->lang = $langObj ?? $contLang; + $this->langcode = $this->lang->getCode(); $this->foreign = !$this->lang->equals( $contLang ); - $request = $this->getRequest(); - - $this->filter = $request->getVal( 'filter', 'all' ); - if ( $this->filter === 'all' ) { + $filter = $opts->getValue( 'filter' ); + if ( $filter === 'all' ) { $this->custom = null; // So won't match in either case } else { - $this->custom = ( $this->filter === 'unmodified' ); + $this->custom = ( $filter === 'unmodified' ); } - $prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) ); + $prefix = $this->getLanguage()->ucfirst( $opts->getValue( 'prefix' ) ); $prefix = $prefix !== '' ? - Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) : + Title::makeTitleSafe( NS_MEDIAWIKI, $opts->getValue( 'prefix' ) ) : null; if ( $prefix !== null ) { - $this->displayPrefix = $prefix->getDBkey(); - $this->prefix = '/^' . preg_quote( $this->displayPrefix, '/' ) . '/i'; + $displayPrefix = $prefix->getDBkey(); + $this->prefix = '/^' . preg_quote( $displayPrefix, '/' ) . '/i'; } else { - $this->displayPrefix = false; $this->prefix = false; } @@ -91,84 +101,6 @@ class AllMessagesTablePager extends TablePager { } } - function buildForm() { - $attrs = [ 'id' => 'mw-allmessages-form-lang', 'name' => 'lang' ]; - $msg = wfMessage( 'allmessages-language' ); - $langSelect = Xml::languageSelector( $this->langcode, false, null, $attrs, $msg ); - - $out = Xml::openElement( 'form', [ - 'method' => 'get', - 'action' => $this->getConfig()->get( 'Script' ), - 'id' => 'mw-allmessages-form' - ] ) . - Xml::fieldset( $this->msg( 'allmessages-filter-legend' )->text() ) . - Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . - Xml::openElement( 'table', [ 'class' => 'mw-allmessages-table' ] ) . "\n" . - ' - ' . - Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) . - "\n - " . - Xml::input( - 'prefix', - 20, - str_replace( '_', ' ', $this->displayPrefix ), - [ 'id' => 'mw-allmessages-form-prefix' ] - ) . - "\n - - \n - " . - $this->msg( 'allmessages-filter' )->escaped() . - "\n - " . - Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(), - 'filter', - 'unmodified', - 'mw-allmessages-form-filter-unmodified', - ( $this->filter === 'unmodified' ) - ) . - Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(), - 'filter', - 'all', - 'mw-allmessages-form-filter-all', - ( $this->filter === 'all' ) - ) . - Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(), - 'filter', - 'modified', - 'mw-allmessages-form-filter-modified', - ( $this->filter === 'modified' ) - ) . - "\n - - \n - " . $langSelect[0] . "\n - " . $langSelect[1] . "\n - " . - - ' - ' . - Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) . - ' - ' . - $this->getLimitSelect( [ 'id' => 'mw-table_pager_limit_label' ] ) . - ' - - - ' . - Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) . - "\n - " . - - Xml::closeElement( 'table' ) . - $this->getHiddenFields( [ 'title', 'prefix', 'filter', 'lang', 'limit' ] ) . - Xml::closeElement( 'fieldset' ) . - Xml::closeElement( 'form' ); - - return $out; - } - function getAllMessages( $descending ) { $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' ); @@ -318,6 +250,7 @@ class AllMessagesTablePager extends TablePager { ] ), $this->msg( 'allmessages-filter-translate' )->text() ); + $talkLink = $this->msg( 'talkpagelinktext' )->escaped(); if ( $this->mCurrentRow->am_customised ) { $title = $linkRenderer->makeKnownLink( $title, $this->getLanguage()->lcfirst( $value ) ); @@ -328,11 +261,11 @@ class AllMessagesTablePager extends TablePager { ); } if ( $this->mCurrentRow->am_talk_exists ) { - $talk = $linkRenderer->makeKnownLink( $talk, $this->talk ); + $talk = $linkRenderer->makeKnownLink( $talk, $talkLink ); } else { $talk = $linkRenderer->makeBrokenLink( $talk, - $this->talk + $talkLink ); } -- 2.20.1