Nikerabbit has uploaded a new change for review.

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

Change subject: Use localstorage for recent groups on Special:Translate
......................................................................

Use localstorage for recent groups on Special:Translate

* Saves a request to the server when accessed.
* Avoids writes on GET requests and user preference overhead.
* Allows recent groups for anonymous users as well.
* Recent tab is now hidden if no recent groups were provided.
* Avoids "CAS update failed on user_touched" exceptions.

Bug: T95753
Change-Id: I9f42278a3d61e2cbbf3157a0446ec395939c73c0
---
M Autoload.php
M Resources.php
M Translate.php
D api/ApiTranslateUser.php
M i18n/api/en.json
M i18n/api/qqq.json
M resources/js/ext.translate.groupselector.js
A resources/js/ext.translate.recentgroups.js
M resources/js/ext.translate.special.translate.js
M specials/SpecialTranslate.php
10 files changed, 58 insertions(+), 111 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Translate 
refs/changes/61/278461/1

diff --git a/Autoload.php b/Autoload.php
index 3fa0f78..4f775a0 100644
--- a/Autoload.php
+++ b/Autoload.php
@@ -210,7 +210,6 @@
 $al['ApiTTMServer'] = "$dir/api/ApiTTMServer.php";
 $al['ApiSearchTranslations'] = "$dir/api/ApiSearchTranslations.php";
 $al['ApiTranslateSandbox'] = "$dir/api/ApiTranslateSandbox.php";
-$al['ApiTranslateUser'] = "$dir/api/ApiTranslateUser.php";
 $al['ApiTranslationAids'] = "$dir/api/ApiQueryTranslationAids.php";
 $al['ApiTranslationReview'] = "$dir/api/ApiTranslationReview.php";
 $al['ApiTranslationStash'] = "$dir/api/ApiTranslationStash.php";
diff --git a/Resources.php b/Resources.php
index 8fbbc4e..38a3916 100644
--- a/Resources.php
+++ b/Resources.php
@@ -265,6 +265,10 @@
        ),
 ) + $resourcePaths;
 
+$wgResourceModules['ext.translate.recentgroups'] = array(
+       'scripts' => 'resources/js/ext.translate.recentgroups.js',
+) + $resourcePaths;
+
 $wgResourceModules['ext.translate.selecttoinput'] = array(
        'scripts' => 'resources/js/ext.translate.selecttoinput.js',
 ) + $resourcePaths;
@@ -448,6 +452,7 @@
                'ext.translate.groupselector',
                'ext.translate.messagetable',
                'ext.translate.navitoggle',
+               'ext.translate.recentgroups',
                'ext.translate.workflowselector',
                'ext.uls.mediawiki',
                'mediawiki.Uri',
diff --git a/Translate.php b/Translate.php
index 9b02e73..8b2619e 100644
--- a/Translate.php
+++ b/Translate.php
@@ -90,7 +90,6 @@
 $wgAPIModules['aggregategroups'] = 'ApiAggregateGroups';
 $wgAPIModules['groupreview'] = 'ApiGroupReview';
 $wgAPIModules['translatesandbox'] = 'ApiTranslateSandbox';
-$wgAPIModules['translateuser'] = 'ApiTranslateUser';
 $wgAPIModules['translationaids'] = 'ApiTranslationAids';
 $wgAPIModules['translationreview'] = 'ApiTranslationReview';
 $wgAPIModules['translationstash'] = 'ApiTranslationStash';
diff --git a/api/ApiTranslateUser.php b/api/ApiTranslateUser.php
deleted file mode 100644
index d799edd..0000000
--- a/api/ApiTranslateUser.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * API module.
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0+
- */
-
-/**
- * API module for collecting and accessing translation related
- * information about the user.
- *
- * @ingroup API TranslateAPI
- * @since 2012-11-30
- */
-class ApiTranslateUser extends ApiBase {
-       public function execute() {
-               $output = array();
-
-               $user = $this->getUser();
-               $groups = $user->getOption( 'translate-recent-groups', '' );
-               $output['recentgroups'] = array();
-               if ( (string)$groups !== '' ) {
-                       $output['recentgroups'] = explode( '|', $groups );
-                       $this->getResult()->setIndexedTagName( 
$output['recentgroups'], 'group' );
-               }
-               $this->getResult()->addValue( null, $this->getModuleName(), 
$output );
-       }
-
-       protected function getExamplesMessages() {
-               return array(
-                       'action=translateuser'
-                               => 'apihelp-translateuser-example-1',
-               );
-       }
-
-       /**
-        * Keeps track of recently used message groups per user.
-        *
-        * @param MessageGroup $group
-        * @param User $user
-        */
-       public static function trackGroup( MessageGroup $group, User $user ) {
-               if ( $user->isAnon() ) {
-                       return;
-               }
-
-               $groups = $user->getOption( 'translate-recent-groups', '' );
-
-               if ( $groups === '' ) {
-                       $groups = array();
-               } else {
-                       $groups = explode( '|', $groups );
-               }
-
-               if ( isset( $groups[0] ) && $groups[0] === $group->getId() ) {
-                       return;
-               }
-
-               array_unshift( $groups, $group->getId() );
-               $groups = array_unique( $groups );
-               $groups = array_slice( $groups, 0, 5 );
-
-               $user->setOption( 'translate-recent-groups', implode( '|', 
$groups ) );
-               // Promise to persist the data post-send
-               DeferredUpdates::addCallableUpdate( function() use ( $user ) {
-                       $user->saveSettings();
-               } );
-       }
-}
diff --git a/i18n/api/en.json b/i18n/api/en.json
index b78a793..8b4b5e5 100644
--- a/i18n/api/en.json
+++ b/i18n/api/en.json
@@ -51,8 +51,6 @@
        "apihelp-translatesandbox-param-username": "Username when creating 
user.",
        "apihelp-translatesandbox-param-password": "Password when creating 
user.",
        "apihelp-translatesandbox-param-email": "Email when creating user.",
-       "apihelp-translateuser-description": "Translation related information 
about the user.",
-       "apihelp-translateuser-example-1": "Show information about the user",
        "apihelp-translationaids-description": "Query all translations aids.",
        "apihelp-translationaids-param-title": "Full title of a known message.",
        "apihelp-translationaids-param-group": "Message group the message 
belongs to. If empty then primary group is used.",
diff --git a/i18n/api/qqq.json b/i18n/api/qqq.json
index 9ba7946..8de1fec 100644
--- a/i18n/api/qqq.json
+++ b/i18n/api/qqq.json
@@ -56,8 +56,6 @@
        "apihelp-translatesandbox-param-username": 
"{{doc-apihelp-param|translatesandbox|username}}",
        "apihelp-translatesandbox-param-password": 
"{{doc-apihelp-param|translatesandbox|password}}",
        "apihelp-translatesandbox-param-email": 
"{{doc-apihelp-param|translatesandbox|email}}",
-       "apihelp-translateuser-description": 
"{{doc-apihelp-description|translateuser}}",
-       "apihelp-translateuser-example-1": 
"{{doc-apihelp-example|translateuser}}",
        "apihelp-translationaids-description": 
"{{doc-apihelp-description|translationaids}}",
        "apihelp-translationaids-param-title": 
"{{doc-apihelp-param|translationaids|title}}",
        "apihelp-translationaids-param-group": 
"{{doc-apihelp-param|translationaids|group}}\n\nThe term \"primary group\" is 
explained at 
https://www.mediawiki.org/wiki/Help:Extension:Translate/Glossary\nas \"primary 
message group\".",
diff --git a/resources/js/ext.translate.groupselector.js 
b/resources/js/ext.translate.groupselector.js
index e9f35c7..dbd8836 100644
--- a/resources/js/ext.translate.groupselector.js
+++ b/resources/js/ext.translate.groupselector.js
@@ -1,7 +1,7 @@
 ( function ( $, mw ) {
        'use strict';
 
-       var groupsLoader, recentGroupsLoader, delay;
+       var groupsLoader, delay;
 
        /**
         * options
@@ -9,6 +9,7 @@
         *  - onSelect: callback with message group id when selected
         *  - language: language for statistics.
         *  - preventSelector: boolean to load but not show the group selector.
+        *  - recent: list of recent group ids
         * groups: list of message group ids
         */
        function TranslateMessageGroupSelector( element, options, groups ) {
@@ -87,11 +88,16 @@
                                .append(
                                        $( '<div>' )
                                                .addClass( 'tux-grouptab 
tux-grouptab--all tux-grouptab--selected' )
-                                               .text( mw.msg( 
'translate-msggroupselector-search-all' ) ),
+                                               .text( mw.msg( 
'translate-msggroupselector-search-all' ) )
+                               );
+
+                       if ( ( this.options.recent || [] ).length ) {
+                               $listFilters.append(
                                        $( '<div>' )
                                                .addClass( 'tux-grouptab 
tux-grouptab--recent' )
                                                .text( mw.msg( 
'translate-msggroupselector-search-recent' ) )
                                );
+                       }
 
                        $searchGroup = $( '<div>' )
                                .addClass( 'tux-groupselector__filter__search' )
@@ -317,8 +323,9 @@
                 * Show recent message groups.
                 */
                showRecentGroups: function () {
-                       $.when( this.loadRecentGroups(), this.loadGroups() )
-                               .done( $.proxy( this.showSelectedGroups, this ) 
);
+                       var recent = this.options.recent || [];
+
+                       this.showSelectedGroups( recent );
                },
 
                /**
@@ -443,33 +450,6 @@
                                .promise();
 
                        return groupsLoader;
-               },
-
-               /**
-                * Returns list of recently used message groups by the user.
-                *
-                * @return {jQuery.Promise}
-                */
-               loadRecentGroups: function () {
-                       var params;
-
-                       if ( recentGroupsLoader !== undefined ) {
-                               return recentGroupsLoader;
-                       }
-
-                       params = {
-                               action: 'translateuser',
-                               format: 'json'
-                       };
-
-                       recentGroupsLoader = new mw.Api()
-                               .get( params )
-                               .then( function ( result ) {
-                                       return 
result.translateuser.recentgroups;
-                               } )
-                               .promise();
-
-                       return recentGroupsLoader;
                },
 
                /**
diff --git a/resources/js/ext.translate.recentgroups.js 
b/resources/js/ext.translate.recentgroups.js
new file mode 100644
index 0000000..7ddcd65
--- /dev/null
+++ b/resources/js/ext.translate.recentgroups.js
@@ -0,0 +1,37 @@
+( function ( $, mw ) {
+       'use strict';
+
+       mw.translate = mw.translate || {};
+
+       /**
+        * Simple wrapper for storing recent groups for an user.
+        *
+        * @class mw.translate.recentGroups
+        * @singleton
+        * @since 2016.03
+        */
+
+       mw.translate.recentGroups = {
+               // TODO: Use mw.storage when MW >= 1.26
+               get: function () {
+                       try {
+                               return JSON.parse( window.localStorage.getItem( 
'translate-recentgroups' ) ) || [];
+                       } catch ( e ) {}
+                       return [];
+               },
+
+               append: function ( value ) {
+                       var items = this.get() || [];
+
+                       items.unshift( value );
+                       items = $.unique( items );
+                       items = items.slice( 0, 5 );
+
+                       try {
+                               window.localStorage.setItem( 
'translate-recentgroups', JSON.stringify( items ) );
+                               return true;
+                       } catch ( e ) {}
+                       return false;
+               }
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/js/ext.translate.special.translate.js 
b/resources/js/ext.translate.special.translate.js
index 5c69dab..4d55e0c 100644
--- a/resources/js/ext.translate.special.translate.js
+++ b/resources/js/ext.translate.special.translate.js
@@ -159,6 +159,8 @@
                        id = $( '.tux-messagetable-loader' ).data( 
'messagegroup' ),
                        props = 'priority|prioritylangs|priorityforce';
 
+               mw.translate.recentGroups.append( id );
+
                $groupWarning.empty();
 
                mw.translate.getMessageGroup( id, props ).done( function ( 
group ) {
@@ -236,12 +238,13 @@
                $( '.tux-breadcrumb .grouplink' ).msggroupselector( {
                        onSelect: mw.translate.changeGroup,
                        language: targetLanguage,
-                       position: position
+                       position: position,
+                       recent: mw.translate.recentGroups.get()
                } );
 
                updateGroupWarning();
 
-               $( '.tux-messagelist' ).messagetable();
+               $messageList.messagetable();
                // Use ULS for language selection if it's available
                ulsOptions = {
                        onSelect: function ( language ) {
diff --git a/specials/SpecialTranslate.php b/specials/SpecialTranslate.php
index 899f3ce..871c76b 100644
--- a/specials/SpecialTranslate.php
+++ b/specials/SpecialTranslate.php
@@ -236,8 +236,6 @@
                        } else {
                                $out->addHTML( $description . $output );
                        }
-
-                       ApiTranslateUser::trackGroup( $this->group, 
$this->getUser() );
                }
 
                if ( $isBeta ) {

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9f42278a3d61e2cbbf3157a0446ec395939c73c0
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Translate
Gerrit-Branch: master
Gerrit-Owner: Nikerabbit <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to