From: Krinkle Date: Wed, 1 Aug 2012 03:19:12 +0000 (+0000) Subject: Revert "AJAXify watchlist editor" X-Git-Tag: 1.31.0-rc.0~22895^2 X-Git-Url: http://git.cyclocoop.org/%22.%24image2.%22?a=commitdiff_plain;h=6f6b786d9095dc0487744b6fbeb02e6b4c86a7ff;p=lhc%2Fweb%2Fwiklou.git Revert "AJAXify watchlist editor" Doesn't properly work on Special:EditWatchlist, some of the titles being unwatched are not fading out and staying behind. There's also a small code quality issue unaddressed. Please re-submit for further review. This reverts commit b46ec8fde5dfd3e80fa3861a01f1aac6f5a7b5ba --- diff --git a/includes/api/ApiWatch.php b/includes/api/ApiWatch.php index a897cfdf2e..c923c6d4bb 100644 --- a/includes/api/ApiWatch.php +++ b/includes/api/ApiWatch.php @@ -40,27 +40,14 @@ class ApiWatch extends ApiBase { if ( !$user->isLoggedIn() ) { $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' ); } + $params = $this->extractRequestParams(); - // titles can handle basic request of 1 title, - // but title is still supported for backward compatability - if ( isset( $params['title'] ) ) { - $title = Title::newFromText( $params['title'] ); - if ( !$title || $title->getNamespace() < 0 ) { - $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) ); - } - $res = $this->watchTitle( $title, $user, $params); - } else { - $pageSet = new ApiPageSet( $this ); - $pageSet->execute(); - $res = array(); - foreach ( $pageSet->getTitles() as $title ) { - $r = $this->watchTitle( $title, $user, $params); - $res[] = $r; - } + $title = Title::newFromText( $params['title'] ); + + if ( !$title || $title->getNamespace() < 0 ) { + $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) ); } - $this->getResult()->addValue( null, $this->getModuleName(), $res ); - } - private function watchTitle( $title, $user, $params ) { + $res = array( 'title' => $title->getPrefixedText() ); if ( $params['unwatch'] ) { @@ -75,7 +62,7 @@ class ApiWatch extends ApiBase { if ( !$success ) { $this->dieUsageMsg( 'hookaborted' ); } - return $res; + $this->getResult()->addValue( null, $this->getModuleName(), $res ); } public function mustBePosted() { @@ -98,10 +85,7 @@ class ApiWatch extends ApiBase { return array( 'title' => array( ApiBase::PARAM_TYPE => 'string', - ), - 'titles' => array( - ApiBase::PARAM_TYPE => 'string', - ApiBase::PARAM_ISMULTI => true + ApiBase::PARAM_REQUIRED => true ), 'unwatch' => false, 'token' => null, diff --git a/includes/specials/SpecialEditWatchlist.php b/includes/specials/SpecialEditWatchlist.php index 4c58e09d30..67f6d688c2 100644 --- a/includes/specials/SpecialEditWatchlist.php +++ b/includes/specials/SpecialEditWatchlist.php @@ -43,8 +43,6 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { const EDIT_RAW = 2; const EDIT_NORMAL = 3; - protected $offset = 0; - protected $limit = 0; protected $successMessage; protected $toc; @@ -94,7 +92,6 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { } } $mode = self::getMode( $this->getRequest(), $mode ); - list( $this->limit, $this->offset ) = $this->getRequest()->getLimitOffset( 50, 'wllimit' ); switch( $mode ) { case self::EDIT_CLEAR: @@ -113,7 +110,6 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { case self::EDIT_NORMAL: default: $out->setPageTitle( $this->msg( 'watchlistedit-normal-title' ) ); - $out->addModules( 'mediawiki.special.editWatchlist' ); $form = $this->getNormalForm(); if( $form->show() ){ $out->addHTML( $this->successMessage ); @@ -268,42 +264,29 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { } /** - * select from DB watchlist items watched by the current user - * @return q query result of watchlist items watched by the current user - */ - private function selectWatchListInfo( ) { - $options = array( - 'ORDER BY' => array( 'wl_namespace', 'wl_title' ), - 'LIMIT' => intval( $this->limit ), - 'OFFSET' => intval( $this->offset ) - ); + * Get a list of titles on a user's watchlist, excluding talk pages, + * and return as a two-dimensional array with namespace and title. + * + * @return array + */ + private function getWatchlistInfo() { + $titles = array(); $dbr = wfGetDB( DB_MASTER ); - //query only non talk namespaces. - $nonTalkNamespaces = MWNamespace::getContentNamespaces(); + $res = $dbr->select( array( 'watchlist' ), array( 'wl_namespace', 'wl_title' ), - array( 'wl_user' => $this->getUser()->getId(), 'wl_namespace' => $nonTalkNamespaces ), + array( 'wl_user' => $this->getUser()->getId() ), __METHOD__, - $options + array( 'ORDER BY' => array( 'wl_namespace', 'wl_title' ) ) ); - return $res; - } - - /** - * Get a list of titles on a user's watchlist, excluding talk pages, - * and return as a two-dimensional array with namespace and title. - * - * @param $watchedItems rows of watched items - * @return array - */ - private function getWatchlistInfo( $watchedItems ) { - $titles = array(); $lb = new LinkBatch(); - foreach ( $watchedItems as $row ) { + foreach ( $res as $row ) { $lb->add( $row->wl_namespace, $row->wl_title ); - $titles[$row->wl_namespace][$row->wl_title] = 1; + if ( !MWNamespace::isTalk( $row->wl_namespace ) ) { + $titles[$row->wl_namespace][$row->wl_title] = 1; + } } $lb->execute(); @@ -478,9 +461,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { $fields = array(); $count = 0; - $watchedItems = $this->selectWatchListInfo(); - $rowNum = $watchedItems->numRows(); - foreach ( $this->getWatchlistInfo( $watchedItems ) as $namespace => $pages ) { + + foreach( $this->getWatchlistInfo() as $namespace => $pages ){ if ( $namespace >= 0 ) { $fields['TitlesNs'.$namespace] = array( 'class' => 'EditWatchlistCheckboxSeriesField', @@ -489,7 +471,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { ); } - foreach ( array_keys( $pages ) as $dbkey ) { + foreach( array_keys( $pages ) as $dbkey ){ $title = Title::makeTitleSafe( $namespace, $dbkey ); if ( $this->checkTitle( $title, $namespace, $dbkey ) ) { $text = $this->buildRemoveLine( $title ); @@ -522,13 +504,10 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { $form = new EditWatchlistNormalHTMLForm( $fields, $this->getContext() ); $form->setTitle( $this->getTitle() ); $form->setSubmitTextMsg( 'watchlistedit-normal-submit' ); - $form->setSubmitID( 'watchlistedit-submit' ); # Used message keys: 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit' $form->setSubmitTooltip('watchlistedit-normal-submit'); $form->setWrapperLegendMsg( 'watchlistedit-normal-legend' ); - $paging = '

' . $this->getLanguage()->viewPrevNext( $this->getTitle(), $this->offset, - $this->limit, array(), ( $rowNum < $this->limit ) ) . '

'; - $form->addHeaderText( $this->msg( 'watchlistedit-normal-explain' )->parse() . $paging ); + $form->addHeaderText( $this->msg( 'watchlistedit-normal-explain' )->parse() ); $form->setSubmitCallback( array( $this, 'submitNormal' ) ); return $form; } @@ -563,7 +542,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { wfRunHooks( 'WatchlistEditorBuildRemoveLine', array( &$tools, $title, $title->isRedirect(), $this->getSkin() ) ); - return '' . $link . '' . " (" . $this->getLanguage()->pipeList( $tools ) . ")"; + return $link . " (" . $this->getLanguage()->pipeList( $tools ) . ")"; } /** diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index 1951853e78..86954ba4d7 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -4527,7 +4527,6 @@ Try normal preview.', To remove a title, check the box next to it, and click "{{int:Watchlistedit-normal-submit}}". You can also [[Special:EditWatchlist/raw|edit the raw list]].', 'watchlistedit-normal-submit' => 'Remove titles', -'watchlistedit-normal-submitting' => 'Removing titles...', 'watchlistedit-normal-done' => '{{PLURAL:$1|1 title was|$1 titles were}} removed from your watchlist:', 'watchlistedit-raw-title' => 'Edit raw watchlist', 'watchlistedit-raw-legend' => 'Edit raw watchlist', diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php index f9a68b18ad..e2d79034a3 100644 --- a/languages/messages/MessagesQqq.php +++ b/languages/messages/MessagesQqq.php @@ -4300,7 +4300,6 @@ Bitrate (of a file, typically) in yottabits (1 yottabits = 1000×1000×1000×100 Hint: the text "Remove Titles" is in {{msg-mw|watchlistedit-normal-submit}}', 'watchlistedit-normal-submit' => 'Text of submit button on [[Special:Watchlist/edit]].', 'watchlistedit-normal-done' => 'Message on [[Special:EditWatchlist]] after pages are removed from the watchlist.', -'watchlistedit-normal-submitting' => 'Text of submit button on [[Special:Watchlist/edit]] when submiting an AJAX request', 'watchlistedit-raw-title' => 'Title of [[Special:Watchlist/raw|Special page]]. {{Identical|Edit raw watchlist}}', diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc index 8d96b3df98..30c3d9ab31 100644 --- a/maintenance/language/messages.inc +++ b/maintenance/language/messages.inc @@ -3399,7 +3399,6 @@ $wgMessageStructure = array( 'watchlistedit-normal-legend', 'watchlistedit-normal-explain', 'watchlistedit-normal-submit', - 'watchlistedit-normal-submiting', 'watchlistedit-normal-done', 'watchlistedit-raw-title', 'watchlistedit-raw-legend', diff --git a/resources/Resources.php b/resources/Resources.php index b4f4617248..26d73c5182 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -799,14 +799,6 @@ return array( 'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.css', 'dependencies' => array( 'jquery.makeCollapsible' ), ), - 'mediawiki.special.editWatchlist' => array( - 'scripts' => 'resources/mediawiki.special/mediawiki.special.editWatchlist.js', - 'dependencies' => array( - 'mediawiki.api', - 'user.tokens' - ), - 'messages' => array( 'watchlistedit-normal-submit', 'watchlistedit-normal-submiting' ) - ), 'mediawiki.special.movePage' => array( 'scripts' => 'resources/mediawiki.special/mediawiki.special.movePage.js', 'dependencies' => 'jquery.byteLimit', diff --git a/resources/mediawiki.special/mediawiki.special.editWatchlist.js b/resources/mediawiki.special/mediawiki.special.editWatchlist.js deleted file mode 100644 index 66329cf6a8..0000000000 --- a/resources/mediawiki.special/mediawiki.special.editWatchlist.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * JavaScript for Special:EditWatchlist - */ - -/** - * Replace the submit button action to operate with ajax. - */ -( function ( mw, $ ) { - $( '#watchlistedit-submit' ).parents( 'form:first' ).on( 'submit.ajax', function ( e ) { - var titlesToRemove, params, api; - titlesToRemove = $.map( $( '.mw-htmlform-flatlist-item input:checked' ), function ( el ) { - return $( el ).val(); - } ).join( '|' ); - params = { - action: 'watch', - titles: titlesToRemove, - token: mw.user.tokens.get( 'watchToken' ), - unwatch: '1' - }; - api = new mw.Api(); - api.ajax( params, { type: 'POST' } ).done( function ( data ) { - $.each( data.watch, function ( e ) { - var removedItem = this.title; - var item = $( '.watchlist-item a' ).filter( function ( ) { - return this.title === removedItem; - } ).parents( '.mw-htmlform-flatlist-item' ).fadeOut(); - } ); - $( '#watchlistedit-submit' ).prop( { - disabled: false, - value: mw.msg( 'watchlistedit-normal-submit' ) - } ); - } ).fail( function () { - //some error occurred. - //re-enable the submit and try to send normal submit - $( '#watchlistedit-submit' ).prop( { - disabled: false, - value: mw.msg( 'watchlistedit-normal-submit' ) - } ).parents( 'form:first' ) - .off( 'submit.ajax' ).submit(); - } ); - $( '#watchlistedit-submit' ).prop( { disabled: true, value: mw.msg( 'watchlistedit-normal-submitting' ) } ); - e.preventDefault(); - } ); -} )( mediaWiki, jQuery );