From 9508c5bd576ee4206eb8e89b7d2ba82985f4e151 Mon Sep 17 00:00:00 2001 From: Florian Date: Mon, 6 Jul 2015 19:48:31 +0200 Subject: [PATCH] Use OOUI HTMLForm for Special:Watchlist Bug: T99256 Change-Id: I47a8649208279a4090623a3088112fcff9abc4d3 --- autoload.php | 2 + .../htmlform/HTMLAdvancedSelectNamespace.php | 64 ++++++++++++++ .../HTMLAdvancedSelectNamespaceWithButton.php | 17 ++++ includes/htmlform/HTMLCheckField.php | 2 +- includes/htmlform/HTMLForm.php | 2 + includes/specials/SpecialWatchlist.php | 84 ++++++++++--------- resources/Resources.php | 4 + .../mediawiki.special.watchlist.css | 4 + 8 files changed, 138 insertions(+), 41 deletions(-) create mode 100644 includes/htmlform/HTMLAdvancedSelectNamespace.php create mode 100644 includes/htmlform/HTMLAdvancedSelectNamespaceWithButton.php create mode 100644 resources/src/mediawiki.special/mediawiki.special.watchlist.css diff --git a/autoload.php b/autoload.php index a8940c47e3..4109740772 100644 --- a/autoload.php +++ b/autoload.php @@ -478,6 +478,8 @@ $wgAutoloadLocalClasses = array( 'GitInfo' => __DIR__ . '/includes/GitInfo.php', 'GlobalDependency' => __DIR__ . '/includes/cache/CacheDependency.php', 'GlobalVarConfig' => __DIR__ . '/includes/config/GlobalVarConfig.php', + 'HTMLAdvancedSelectNamespace' => __DIR__ . '/includes/htmlform/HTMLAdvancedSelectNamespace.php', + 'HTMLAdvancedSelectNamespaceWithButton' => __DIR__ . '/includes/htmlform/HTMLAdvancedSelectNamespaceWithButton.php', 'HTMLApiField' => __DIR__ . '/includes/htmlform/HTMLApiField.php', 'HTMLAutoCompleteSelectField' => __DIR__ . '/includes/htmlform/HTMLAutoCompleteSelectField.php', 'HTMLButtonField' => __DIR__ . '/includes/htmlform/HTMLButtonField.php', diff --git a/includes/htmlform/HTMLAdvancedSelectNamespace.php b/includes/htmlform/HTMLAdvancedSelectNamespace.php new file mode 100644 index 0000000000..348d17027f --- /dev/null +++ b/includes/htmlform/HTMLAdvancedSelectNamespace.php @@ -0,0 +1,64 @@ +mParams['all'] ) ? $this->mParams['all'] : '' ); + + return parent::getInputHTML( $value ) . ' ' . + Xml::checkLabel( + $this->msg( 'invert' )->text(), + $this->mParams['invertname'], + $this->mParams['invertid'], + $this->mParams['invertdefault'], + array( 'title' => $this->msg( 'tooltip-invert' )->text() ) + ) . ' ' . + Xml::checkLabel( + $this->msg( 'namespace_association' )->text(), + $this->mParams['associatedname'], + $this->mParams['associatedid'], + $this->mParams['associateddefault'], + array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() ) + ); + } + + /** + * Get the OOUI version of this field. + * @since 1.26 + * @param string $value + * @return MediaWiki\\Widget\\NamespaceInputWidget A layout with all widget. + */ + public function getInputOOUI( $value ) { + # There are more fields in this Widget as only one, so there are more values instead of only once. + # Filter the data from the request before creating the form to set the correct values to the + # Widget elements. + # Get WebRequest only, if there is an instance of HTMLForm, use default data instead + $invertdefault = false; + $associateddefault = false; + if ( $this->mParent instanceof HTMLForm ) { + $request = $this->mParent->getRequest(); + if ( $request->getCheck( $this->mParams['associatedname'] ) ) { + $associateddefault = true; + } + if ( $request->getCheck( $this->mParams['invertname'] ) ) { + $invertdefault = true; + } + } + + // Unsupported: invertid, associatedid + return new MediaWiki\Widget\NamespaceInputWidget( array( + 'valueNamespace' => $value, + 'nameNamespace' => $this->mName, + 'id' => $this->mID, + 'includeAllValue' => $this->mAllValue, + 'nameInvert' => $this->mParams['invertname'], + 'labelInvert' => $this->msg( 'invert' )->text(), + 'valueInvert' => $invertdefault, + 'nameAssociated' => $this->mParams['associatedname'], + 'valueAssociated' => $associateddefault, + 'labelAssociated' => $this->msg( 'namespace_association' )->text(), + ) ); + } +} diff --git a/includes/htmlform/HTMLAdvancedSelectNamespaceWithButton.php b/includes/htmlform/HTMLAdvancedSelectNamespaceWithButton.php new file mode 100644 index 0000000000..71c9509f03 --- /dev/null +++ b/includes/htmlform/HTMLAdvancedSelectNamespaceWithButton.php @@ -0,0 +1,17 @@ +mClassWithButton = new HTMLFormFieldWithButton( $info ); + parent::__construct( $info ); + } + + public function getInputHTML( $value ) { + return $this->mClassWithButton->getElement( parent::getInputHTML( $value ) ); + } +} diff --git a/includes/htmlform/HTMLCheckField.php b/includes/htmlform/HTMLCheckField.php index 9666c4ea87..646b0d5a26 100644 --- a/includes/htmlform/HTMLCheckField.php +++ b/includes/htmlform/HTMLCheckField.php @@ -14,7 +14,7 @@ class HTMLCheckField extends HTMLFormField { $attr = $this->getTooltipAndAccessKey(); $attr['id'] = $this->mID; - $attr += $this->getAttributes( array( 'disabled', 'tabindex' ) ); + $attr += $this->getAttributes( array( 'disabled', 'tabindex', 'title' ) ); if ( $this->mClass !== '' ) { $attr['class'] = $this->mClass; diff --git a/includes/htmlform/HTMLForm.php b/includes/htmlform/HTMLForm.php index a56b398df3..b10d789344 100644 --- a/includes/htmlform/HTMLForm.php +++ b/includes/htmlform/HTMLForm.php @@ -140,6 +140,8 @@ class HTMLForm extends ContextSource { 'selectandother' => 'HTMLSelectAndOtherField', 'namespaceselect' => 'HTMLSelectNamespace', 'namespaceselectwithbutton' => 'HTMLSelectNamespaceWithButton', + 'advancednamespaceselect' => 'HTMLAdvancedSelectNamespace', + 'advancednamespaceselectwithbutton' => 'HTMLAdvancedSelectNamespaceWithButton', 'tagfilter' => 'HTMLTagFilter', 'submit' => 'HTMLSubmitField', 'hidden' => 'HTMLHiddenField', diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php index 20f577603b..211798ecb3 100644 --- a/includes/specials/SpecialWatchlist.php +++ b/includes/specials/SpecialWatchlist.php @@ -396,6 +396,8 @@ class SpecialWatchlist extends ChangesListSpecialPage { */ public function doHeader( $opts, $numRows ) { $user = $this->getUser(); + $out = $this->getOutput(); + $out->addModules( 'mediawiki.special.watchlist' ); $this->getOutput()->addSubtitle( $this->msg( 'watchlistfor2', $user->getName() ) @@ -450,39 +452,34 @@ class SpecialWatchlist extends ChangesListSpecialPage { $form .= $wlInfo; $form .= $cutofflinks; $form .= $lang->pipeList( $links ) . "\n"; - $form .= "
\n

"; - $form .= Html::namespaceSelector( - array( - 'selected' => $opts['namespace'], - 'all' => '', - 'label' => $this->msg( 'namespace' )->text() - ), array( + $form .= "


\n"; + $out->addHtml( $form ); + + $formDescriptor = array( + 'namespace' => array( + 'class' => 'HTMLAdvancedSelectNamespaceWithButton', + 'label-message' => 'namespace', + 'default' => $opts['namespace'], 'name' => 'namespace', 'id' => 'namespace', - 'class' => 'namespaceselector', - ) - ) . ' '; - $form .= Xml::checkLabel( - $this->msg( 'invert' )->text(), - 'invert', - 'nsinvert', - $opts['invert'], - array( 'title' => $this->msg( 'tooltip-invert' )->text() ) - ) . ' '; - $form .= Xml::checkLabel( - $this->msg( 'namespace_association' )->text(), - 'associated', - 'nsassociated', - $opts['associated'], - array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() ) - ) . ' '; - $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "

\n"; - foreach ( $hiddenFields as $key => $value ) { - $form .= Html::hidden( $key, $value ) . "\n"; - } + 'invertdefault' => $opts['invert'], + 'invertname' => 'invert', + 'invertid' => 'nsinvert', + 'associateddefault' => $opts['associated'], + 'associatedname' => 'associated', + 'associatedid' => 'nsassociated', + 'buttondefault' => $this->msg( 'allpagessubmit' )->text(), + ), + ); + $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() ); + $htmlForm->suppressDefaultSubmit(); + $htmlForm->addHiddenFields( $hiddenFields ); + $htmlForm->prepareForm()->displayForm( false ); + + $form = ''; $form .= Xml::closeElement( 'fieldset' ) . "\n"; $form .= Xml::closeElement( 'form' ) . "\n"; - $this->getOutput()->addHTML( $form ); + $out->addHtml( $form ); $this->setBottomText( $opts ); } @@ -491,6 +488,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { $nondefaults = $opts->getChangedValues(); $form = ""; $user = $this->getUser(); + $out = $this->getOutput(); $dbr = $this->getDB(); $numItems = $this->countItems( $dbr ); @@ -513,19 +511,25 @@ class SpecialWatchlist extends ChangesListSpecialPage { } $form .= "

"; + $out->addHTML( $form ); + if ( $numItems > 0 && $showUpdatedMarker ) { - $form .= Xml::openElement( 'form', array( 'method' => 'post', - 'action' => $this->getPageTitle()->getLocalURL(), - 'id' => 'mw-watchlist-resetbutton' ) ) . "\n" . - Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" . - Html::hidden( 'reset', 'all' ) . "\n"; - foreach ( $nondefaults as $key => $value ) { - $form .= Html::hidden( $key, $value ) . "\n"; - } - $form .= Xml::closeElement( 'form' ) . "\n"; + $formDescriptor = array( + 'resetbutton' => array( + 'type' => 'submit', + 'name' => 'dummy', + 'default' => $this->msg( 'enotif_reset' )->text(), + ), + ); + $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() ); + $htmlForm->suppressDefaultSubmit(); + $htmlForm->setId( 'mw-watchlist-resetbutton' ); + $nondefaults['reset'] = 'all'; + $htmlForm->addHiddenFields( $nondefaults ); + $htmlForm->prepareForm()->displayForm( false ); } - $form .= Xml::openElement( 'form', array( + $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getPageTitle()->getLocalURL(), 'id' => 'mw-watchlist-form' @@ -538,7 +542,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { $form .= SpecialRecentChanges::makeLegend( $this->getContext() ); - $this->getOutput()->addHTML( $form ); + $out->addHTML( $form ); } protected function showHideLink( $options, $message, $name, $value ) { diff --git a/resources/Resources.php b/resources/Resources.php index fb0971e49a..46b44a662a 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -1655,6 +1655,10 @@ return array( 'mediawiki.special.version' => array( 'styles' => 'resources/src/mediawiki.special/mediawiki.special.version.css', ), + 'mediawiki.special.watchlist' => array( + 'position' => 'top', + 'styles' => 'resources/src/mediawiki.special/mediawiki.special.watchlist.css', + ), /* MediaWiki Installer */ diff --git a/resources/src/mediawiki.special/mediawiki.special.watchlist.css b/resources/src/mediawiki.special/mediawiki.special.watchlist.css new file mode 100644 index 0000000000..c802f8cdd8 --- /dev/null +++ b/resources/src/mediawiki.special/mediawiki.special.watchlist.css @@ -0,0 +1,4 @@ +.mw-htmlform-ooui-wrapper { + /* We're gonna need a bigger form! */ + width: 60em; +} -- 2.20.1