Eranroz has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/53968


Change subject: AJAXify watchlist editor
......................................................................

AJAXify watchlist editor

This patch makes the watchlist editor to use pagination. That would
avoid old browsers crashing (bug 20483).
Patch also add some AJAX operations to the editor, for example to remove
items from watchlist (bug 32151).

Splitted from: 17216
See also: 53964

Change-Id: I11451c334fba008040b6a3c64b6344b2fc2b6887
---
M includes/specials/SpecialEditWatchlist.php
M languages/messages/MessagesEn.php
M languages/messages/MessagesQqq.php
M maintenance/language/messages.inc
M resources/Resources.php
A resources/mediawiki.special/mediawiki.special.editWatchlist.js
6 files changed, 108 insertions(+), 19 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/68/53968/1

diff --git a/includes/specials/SpecialEditWatchlist.php 
b/includes/specials/SpecialEditWatchlist.php
index d2838e0..9b4aaa4 100644
--- a/includes/specials/SpecialEditWatchlist.php
+++ b/includes/specials/SpecialEditWatchlist.php
@@ -43,6 +43,8 @@
        const EDIT_RAW = 2;
        const EDIT_NORMAL = 3;
 
+       protected $offset = 0;
+       protected $limit = 0;
        protected $successMessage;
 
        protected $toc;
@@ -93,6 +95,7 @@
                        }
                }
                $mode = self::getMode( $this->getRequest(), $mode );
+               list( $this->limit, $this->offset ) = 
$this->getRequest()->getLimitOffset( 50, 'wllimit' );
 
                switch( $mode ) {
                        case self::EDIT_CLEAR:
@@ -111,6 +114,7 @@
                        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 );
@@ -279,29 +283,42 @@
        }
 
        /**
+       * 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 )
+               );
+               $dbr = wfGetDB( DB_MASTER );
+               //query only non talk namespaces.
+               $nonTalkNamespaces = MWNamespace::getSubjectNamespaces();
+               $res = $dbr->select(
+                       array( 'watchlist' ),
+                       array( 'wl_namespace',  'wl_title' ),
+                       array( 'wl_user' => $this->getUser()->getId(), 
'wl_namespace' => $nonTalkNamespaces  ),
+                       __METHOD__,
+                       $options
+               );
+
+               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() {
+       private function getWatchlistInfo( $watchedItems ) {
                $titles = array();
-               $dbr = wfGetDB( DB_MASTER );
-
-               $res = $dbr->select(
-                       array( 'watchlist' ),
-                       array( 'wl_namespace', 'wl_title' ),
-                       array( 'wl_user' => $this->getUser()->getId() ),
-                       __METHOD__,
-                       array( 'ORDER BY' => array( 'wl_namespace', 'wl_title' 
) )
-               );
-
                $lb = new LinkBatch();
-               foreach ( $res as $row ) {
+               foreach ( $watchedItems as $row ) {
                        $lb->add( $row->wl_namespace, $row->wl_title );
-                       if ( !MWNamespace::isTalk( $row->wl_namespace ) ) {
-                               $titles[$row->wl_namespace][$row->wl_title] = 1;
-                       }
+                       $titles[$row->wl_namespace][$row->wl_title] = 1;
                }
 
                $lb->execute();
@@ -477,7 +494,9 @@
                $fields = array();
                $count = 0;
 
-               foreach( $this->getWatchlistInfo() as $namespace => $pages ) {
+               $watchedItems = $this->selectWatchListInfo();
+               $rowNum = $watchedItems->numRows();
+               foreach ( $this->getWatchlistInfo( $watchedItems ) as 
$namespace => $pages ) {
                        if ( $namespace >= 0 ) {
                                $fields['TitlesNs' . $namespace] = array(
                                        'class' => 
'EditWatchlistCheckboxSeriesField',
@@ -486,7 +505,7 @@
                                );
                        }
 
-                       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 
);
@@ -519,10 +538,13 @@
                $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' );
-               $form->addHeaderText( $this->msg( 
'watchlistedit-normal-explain' )->parse() );
+               $paging = '<p>' . $this->getLanguage()->viewPrevNext( 
$this->getTitle(), $this->offset,
+                               $this->limit,  array(), ( $rowNum < 
$this->limit ) ) . '</p>';
+               $form->addHeaderText( $this->msg( 
'watchlistedit-normal-explain' )->parse() . $paging );
                $form->setSubmitCallback( array( $this, 'submitNormal' ) );
                return $form;
        }
@@ -557,7 +579,7 @@
 
                wfRunHooks( 'WatchlistEditorBuildRemoveLine', array( &$tools, 
$title, $title->isRedirect(), $this->getSkin() ) );
 
-               return $link . " (" . $this->getLanguage()->pipeList( $tools ) 
. ")";
+               return '<span class="watchlist-item">' . $link . '</span>' . " 
(" . $this->getLanguage()->pipeList( $tools ) . ")";
        }
 
        /**
diff --git a/languages/messages/MessagesEn.php 
b/languages/messages/MessagesEn.php
index e07da4ff..56aa275 100644
--- a/languages/messages/MessagesEn.php
+++ b/languages/messages/MessagesEn.php
@@ -4638,6 +4638,7 @@
 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 c39e9eb..9ec923a 100644
--- a/languages/messages/MessagesQqq.php
+++ b/languages/messages/MessagesQqq.php
@@ -8170,6 +8170,7 @@
 * {{msg-mw|Accesskey-watchlistedit-normal-submit}}
 * {{msg-mw|Tooltip-watchlistedit-normal-submit}}',
 '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 7c16df6..79b750c 100644
--- a/maintenance/language/messages.inc
+++ b/maintenance/language/messages.inc
@@ -3500,6 +3500,7 @@
                '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 f5a31fd..0086b25 100644
--- a/resources/Resources.php
+++ b/resources/Resources.php
@@ -902,6 +902,17 @@
                '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
new file mode 100644
index 0000000..96a480f
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.editWatchlist.js
@@ -0,0 +1,53 @@
+/*
+ * JavaScript for Special:EditWatchlist
+ */
+
+/**
+ * Replace the submit button action to operate with ajax.
+ */
+( function ( mw, $ ) {
+       /**
+       * @param {jQuery.Event} e
+       */
+       function ajaxSubmit( 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.post( params )
+                       .done( function ( data ) {
+                               var $watchCheckboxes = $( 
'.mw-htmlform-flatlist-item input[type="checkbox"]' );
+                               $.each( data.watch, function ( i, e ) {
+                                       $watchCheckboxes.filter( function ( ) {
+                                               return this.value === e.title;
+                                       } ).parents( 
'.mw-htmlform-flatlist-item' )
+                                       .fadeOut( 'slow', function() {
+                                               $( this ).remove();
+                                       } );
+                               } );
+                               $( '#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', ajaxSubmit ).submit();
+                       } );
+               $( '#watchlistedit-submit' ).prop( { disabled: true, value:  
mw.msg( 'watchlistedit-normal-submitting' )  } );
+               e.preventDefault();
+       }
+
+       $( '#watchlistedit-submit' ).parents( 'form:first' ).on( 'submit', 
ajaxSubmit );
+} )( mediaWiki, jQuery );

-- 
To view, visit https://gerrit.wikimedia.org/r/53968
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I11451c334fba008040b6a3c64b6344b2fc2b6887
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Eranroz <eranro...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to