From 598068334e72be83088b9acdf674a79293f040ba Mon Sep 17 00:00:00 2001 From: Sethakill Date: Sun, 8 May 2016 12:03:29 +0200 Subject: [PATCH] Convert Special:MergeHistory to use OOUI. Bug: T134675 Change-Id: I8234632daff04902f317b5d8c84207e30b845358 --- includes/specials/SpecialMergeHistory.php | 314 +++++++++------------- 1 file changed, 123 insertions(+), 191 deletions(-) diff --git a/includes/specials/SpecialMergeHistory.php b/includes/specials/SpecialMergeHistory.php index b916c1fc78..162ef60d8f 100644 --- a/includes/specials/SpecialMergeHistory.php +++ b/includes/specials/SpecialMergeHistory.php @@ -28,38 +28,14 @@ * @ingroup SpecialPage */ class SpecialMergeHistory extends SpecialPage { - /** @var string */ - protected $mAction; + /** @var FormOptions */ + protected $mOpts; - /** @var string */ - protected $mTarget; + /** @var Status */ + protected $mStatus; - /** @var string */ - protected $mDest; - - /** @var string */ - protected $mTimestamp; - - /** @var int */ - protected $mTargetID; - - /** @var int */ - protected $mDestID; - - /** @var string */ - protected $mComment; - - /** @var bool Was posted? */ - protected $mMerge; - - /** @var bool Was submitted? */ - protected $mSubmitted; - - /** @var Title */ - protected $mTargetObj; - - /** @var Title */ - protected $mDestObj; + /** @var Title|null */ + protected $mTargetObj, $mDestObj; /** @var int[] */ public $prevId; @@ -72,124 +48,107 @@ class SpecialMergeHistory extends SpecialPage { return true; } - /** - * @return void - */ - private function loadRequestParams() { - $request = $this->getRequest(); - $this->mAction = $request->getVal( 'action' ); - $this->mTarget = $request->getVal( 'target' ); - $this->mDest = $request->getVal( 'dest' ); - $this->mSubmitted = $request->getBool( 'submitted' ); - - $this->mTargetID = intval( $request->getVal( 'targetID' ) ); - $this->mDestID = intval( $request->getVal( 'destID' ) ); - $this->mTimestamp = $request->getVal( 'mergepoint' ); - if ( !preg_match( '/[0-9]{14}/', $this->mTimestamp ) ) { - $this->mTimestamp = ''; - } - $this->mComment = $request->getText( 'wpComment' ); - - $this->mMerge = $request->wasPosted() - && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) ); - - // target page - if ( $this->mSubmitted ) { - $this->mTargetObj = Title::newFromText( $this->mTarget ); - $this->mDestObj = Title::newFromText( $this->mDest ); - } else { - $this->mTargetObj = null; - $this->mDestObj = null; - } - } - public function execute( $par ) { $this->useTransactionalTimeLimit(); $this->checkPermissions(); $this->checkReadOnly(); - $this->loadRequestParams(); - $this->setHeaders(); $this->outputHeader(); - if ( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) { + $this->addHelpLink( 'Help:Merge history' ); + + $opts = new FormOptions(); + + $opts->add( 'target', '' ); + $opts->add( 'dest', '' ); + $opts->add( 'target', '' ); + $opts->add( 'mergepoint', '' ); + $opts->add( 'reason', '' ); + $opts->add( 'merge', false ); + + $opts->fetchValuesFromRequest( $this->getRequest() ); + + $target = $opts->getValue( 'target' ); + $dest = $opts->getValue( 'dest' ); + $targetObj = Title::newFromText( $target ); + $destObj = Title::newFromText( $dest ); + $status = Status::newGood(); + + $this->mOpts = $opts; + $this->mTargetObj = $targetObj; + $this->mDestObj = $destObj; + + if ( $opts->getValue( 'merge' ) && $targetObj && + $destObj && $opts->getValue( 'mergepoint' ) !== '' ) { $this->merge(); return; } - if ( !$this->mSubmitted ) { + if ( $target === '' && $dest === '' ) { $this->showMergeForm(); return; } - $errors = []; - if ( !$this->mTargetObj instanceof Title ) { - $errors[] = $this->msg( 'mergehistory-invalid-source' )->parseAsBlock(); - } elseif ( !$this->mTargetObj->exists() ) { - $errors[] = $this->msg( 'mergehistory-no-source', - wfEscapeWikiText( $this->mTargetObj->getPrefixedText() ) - )->parseAsBlock(); + if ( !$targetObj instanceof Title ) { + $status->merge( Status::newFatal( 'mergehistory-invalid-source' ) ); + } elseif ( !$targetObj->exists() ) { + $status->merge( Status::newFatal( 'mergehistory-no-source', + wfEscapeWikiText( $targetObj->getPrefixedText() ) + ) ); } - if ( !$this->mDestObj instanceof Title ) { - $errors[] = $this->msg( 'mergehistory-invalid-destination' )->parseAsBlock(); - } elseif ( !$this->mDestObj->exists() ) { - $errors[] = $this->msg( 'mergehistory-no-destination', - wfEscapeWikiText( $this->mDestObj->getPrefixedText() ) - )->parseAsBlock(); + if ( !$destObj instanceof Title ) { + $status->merge( Status::newFatal( 'mergehistory-invalid-destination' ) ); + } elseif ( !$destObj->exists() ) { + $status->merge( Status::newFatal( 'mergehistory-no-destination', + wfEscapeWikiText( $destObj->getPrefixedText() ) + ) ); } - if ( $this->mTargetObj && $this->mDestObj && $this->mTargetObj->equals( $this->mDestObj ) ) { - $errors[] = $this->msg( 'mergehistory-same-destination' )->parseAsBlock(); + if ( $targetObj && $destObj && $targetObj->equals( $destObj ) ) { + $status->merge( Status::newFatal( 'mergehistory-same-destination' ) ); } - if ( count( $errors ) ) { - $this->showMergeForm(); - $this->getOutput()->addHTML( implode( "\n", $errors ) ); - } else { + $this->mStatus = $status; + + $this->showMergeForm(); + + if ( $status->isOK() ) { $this->showHistory(); } } function showMergeForm() { - $out = $this->getOutput(); - $out->addWikiMsg( 'mergehistory-header' ); - - $out->addHTML( - Xml::openElement( 'form', [ - 'method' => 'get', - 'action' => wfScript() ] ) . - '
' . - Xml::element( 'legend', [], - $this->msg( 'mergehistory-box' )->text() ) . - Html::hidden( 'title', $this->getPageTitle()->getPrefixedDBkey() ) . - Html::hidden( 'submitted', '1' ) . - Html::hidden( 'mergepoint', $this->mTimestamp ) . - Xml::openElement( 'table' ) . - ' - ' . Xml::label( $this->msg( 'mergehistory-from' )->text(), 'target' ) . ' - ' . Xml::input( 'target', 30, $this->mTarget, [ 'id' => 'target' ] ) . ' - - ' . Xml::label( $this->msg( 'mergehistory-into' )->text(), 'dest' ) . ' - ' . Xml::input( 'dest', 30, $this->mDest, [ 'id' => 'dest' ] ) . ' - ' . - Xml::submitButton( $this->msg( 'mergehistory-go' )->text() ) . - '' . - Xml::closeElement( 'table' ) . - '
' . - '' - ); - - $this->addHelpLink( 'Help:Merge history' ); + $formDescriptor = [ + 'target' => [ + 'type' => 'title', + 'name' => 'target', + 'label-message' => 'mergehistory-from', + 'required' => true, + ], + + 'dest' => [ + 'type' => 'title', + 'name' => 'dest', + 'label-message' => 'mergehistory-into', + 'required' => true, + ], + ]; + + $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() ) + ->setIntro( $this->msg( 'mergehistory-header' ) ) + ->setWrapperLegendMsg( 'mergehistory-box' ) + ->setSubmitTextMsg( 'mergehistory-go' ) + ->setMethod( 'post' ) + ->prepareForm() + ->displayForm( $this->mStatus ); } private function showHistory() { - $this->showMergeForm(); - # List all stored revisions $revisions = new MergeHistoryPager( $this, [], $this->mTargetObj, $this->mDestObj @@ -197,62 +156,46 @@ class SpecialMergeHistory extends SpecialPage { $haveRevisions = $revisions && $revisions->getNumRows() > 0; $out = $this->getOutput(); - $titleObj = $this->getPageTitle(); - $action = $titleObj->getLocalURL( [ 'action' => 'submit' ] ); - # Start the form here - $top = Xml::openElement( - 'form', - [ - 'method' => 'post', - 'action' => $action, - 'id' => 'merge' - ] - ); - $out->addHTML( $top ); - - if ( $haveRevisions ) { - # Format the user-visible controls (comment field, submission button) - # in a nice little table - $table = - Xml::openElement( 'fieldset' ) . - $this->msg( 'mergehistory-merge', $this->mTargetObj->getPrefixedText(), - $this->mDestObj->getPrefixedText() )->parse() . - Xml::openElement( 'table', [ 'id' => 'mw-mergehistory-table' ] ) . - ' - ' . - Xml::label( $this->msg( 'mergehistory-reason' )->text(), 'wpComment' ) . - ' - ' . - Xml::input( 'wpComment', 50, $this->mComment, [ 'id' => 'wpComment' ] ) . - ' - - -   - ' . - Xml::submitButton( - $this->msg( 'mergehistory-submit' )->text(), - [ 'name' => 'merge', 'id' => 'mw-merge-submit' ] - ) . - ' - ' . - Xml::closeElement( 'table' ) . - Xml::closeElement( 'fieldset' ); - - $out->addHTML( $table ); - } - - $out->addHTML( - '

' . - $this->msg( 'mergehistory-list' )->escaped() . "

\n" - ); + $header = '

' . + $this->msg( 'mergehistory-list' )->escaped() . "

\n"; if ( $haveRevisions ) { - $out->addHTML( $revisions->getNavigationBar() ); - $out->addHTML( '' ); - $out->addHTML( $revisions->getNavigationBar() ); + $hiddenFields = [ + 'merge' => true, + 'target' => $this->mOpts->getValue( 'target' ), + 'dest' => $this->mOpts->getValue( 'dest' ), + ]; + + $formDescriptor = [ + 'reason' => [ + 'type' => 'text', + 'name' => 'reason', + 'label-message' => 'mergehistory-reason', + ], + ]; + + $mergeText = $this->msg( 'mergehistory-merge', + $this->mTargetObj->getPrefixedText(), + $this->mDestObj->getPrefixedText() + )->parse(); + + $history = $header . + $revisions->getNavigationBar() . + '' . + $revisions->getNavigationBar(); + + $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() ) + ->addHiddenFields( $hiddenFields ) + ->setPreText( $mergeText ) + ->setFooterText( $history ) + ->setSubmitTextMsg( 'mergehistory-submit' ) + ->setMethod( 'post' ) + ->prepareForm() + ->displayForm( false ); } else { + $out->addHTML( $header ); $out->addWikiMsg( 'mergehistory-empty' ); } @@ -260,18 +203,6 @@ class SpecialMergeHistory extends SpecialPage { $mergeLogPage = new LogPage( 'merge' ); $out->addHTML( '

' . $mergeLogPage->getName()->escaped() . "

\n" ); LogEventsList::showLogExtract( $out, 'merge', $this->mTargetObj ); - - # When we submit, go by page ID to avoid some nasty but unlikely collisions. - # Such would happen if a page was renamed after the form loaded, but before submit - $misc = Html::hidden( 'targetID', $this->mTargetObj->getArticleID() ); - $misc .= Html::hidden( 'destID', $this->mDestObj->getArticleID() ); - $misc .= Html::hidden( 'target', $this->mTarget ); - $misc .= Html::hidden( 'dest', $this->mDest ); - $misc .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() ); - $misc .= Xml::closeElement( 'form' ); - $out->addHTML( $misc ); - - return true; } function formatRevisionRow( $row ) { @@ -281,7 +212,7 @@ class SpecialMergeHistory extends SpecialPage { $last = $this->msg( 'last' )->escaped(); $ts = wfTimestamp( TS_MW, $row->rev_timestamp ); - $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mTimestamp === $ts ) ); + $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mOpts->getValue( 'mergepoint' ) === $ts ) ); $user = $this->getUser(); @@ -336,23 +267,24 @@ class SpecialMergeHistory extends SpecialPage { * @return bool Success */ function merge() { + $opts = $this->mOpts; + # Get the titles directly from the IDs, in case the target page params # were spoofed. The queries are done based on the IDs, so it's best to # keep it consistent... - $targetTitle = Title::newFromID( $this->mTargetID ); - $destTitle = Title::newFromID( $this->mDestID ); - if ( is_null( $targetTitle ) || is_null( $destTitle ) ) { - return false; // validate these - } - if ( $targetTitle->getArticleID() == $destTitle->getArticleID() ) { + $targetObj = $this->mTargetObj; + $destObj = $this->mDestObj; + + if ( is_null( $targetObj ) || is_null( $destObj ) || + $targetObj->getArticleID() == $destObj->getArticleID() ) { return false; } // MergeHistory object - $mh = new MergeHistory( $targetTitle, $destTitle, $this->mTimestamp ); + $mh = new MergeHistory( $targetObj, $destObj, $opts->getValue( 'mergepoint' ) ); // Merge! - $mergeStatus = $mh->merge( $this->getUser(), $this->mComment ); + $mergeStatus = $mh->merge( $this->getUser(), $opts->getValue( 'reason' ) ); if ( !$mergeStatus->isOK() ) { // Failed merge $this->getOutput()->addWikiMsg( $mergeStatus->getMessage() ); @@ -360,7 +292,7 @@ class SpecialMergeHistory extends SpecialPage { } $targetLink = Linker::link( - $targetTitle, + $targetObj, null, [], [ 'redirect' => 'no' ] @@ -368,7 +300,7 @@ class SpecialMergeHistory extends SpecialPage { $this->getOutput()->addWikiMsg( $this->msg( 'mergehistory-done' ) ->rawParams( $targetLink ) - ->params( $destTitle->getPrefixedText() ) + ->params( $destObj->getPrefixedText() ) ->numParams( $mh->getMergedRevisionCount() ) ); -- 2.20.1