RCFilters: Export config vars in the RL modules where possible (take 2)
authorCatrope <roan@wikimedia.org>
Fri, 15 Feb 2019 22:12:02 +0000 (22:12 +0000)
committerRoan Kattouw <roan.kattouw@gmail.com>
Thu, 21 Feb 2019 00:24:01 +0000 (16:24 -0800)
This reverts commit 492969e12bb34c6832213769d822d0b3d564550c
and reinstates commit bf4f9d0313495dd67a53b9925edf9a3cc6ef36fe.

Bug: T201574
Depends-On: I58901657daf3e82229a303d8fe7a2c051ffe7634
Change-Id: I1b0a777760d4c2a149415da0d2068e6bfea5b917

includes/changetags/ChangeTags.php
includes/specialpage/ChangesListSpecialPage.php
includes/specials/SpecialWatchlist.php
resources/Resources.php
resources/src/mediawiki.rcfilters/Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/ui/FilterWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/WatchlistTopSectionWidget.js

index 66a8165..91877f2 100644 (file)
@@ -141,11 +141,11 @@ class ChangeTags {
         * we consider the tag hidden, and return false.
         *
         * @param string $tag
-        * @param IContextSource $context
+        * @param MessageLocalizer $context
         * @return string|bool Tag description or false if tag is to be hidden.
         * @since 1.25 Returns false if tag is to be hidden.
         */
-       public static function tagDescription( $tag, IContextSource $context ) {
+       public static function tagDescription( $tag, MessageLocalizer $context ) {
                $msg = $context->msg( "tag-$tag" );
                if ( !$msg->exists() ) {
                        // No such message, so return the HTML-escaped tag name.
@@ -168,11 +168,11 @@ class ChangeTags {
         * for the long description.
         *
         * @param string $tag
-        * @param IContextSource $context
+        * @param MessageLocalizer $context
         * @return Message|bool Message object of the tag long description or false if
         *  there is no description.
         */
-       public static function tagLongDescriptionMessage( $tag, IContextSource $context ) {
+       public static function tagLongDescriptionMessage( $tag, MessageLocalizer $context ) {
                $msg = $context->msg( "tag-$tag-description" );
                if ( !$msg->exists() ) {
                        return false;
@@ -196,6 +196,8 @@ class ChangeTags {
         * @return string Truncated long tag description.
         */
        public static function truncateTagDescription( $tag, $length, IContextSource $context ) {
+               // FIXME: Make this accept MessageLocalizer and Language instead of IContextSource
+
                $originalDesc = self::tagLongDescriptionMessage( $tag, $context );
                // If there is no tag description, return empty string
                if ( !$originalDesc ) {
index ea1cf59..154e94e 100644 (file)
@@ -792,10 +792,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        $out->addJsConfigVars( 'wgStructuredChangeFiltersMessages', $messages );
                        $out->addJsConfigVars( 'wgStructuredChangeFiltersCollapsedState', $collapsed );
 
-                       $out->addJsConfigVars(
-                               'wgRCFiltersChangeTags',
-                               $this->getChangeTagList()
-                       );
                        $out->addJsConfigVars(
                                'StructuredChangeFiltersDisplayConfig',
                                [
@@ -823,26 +819,35 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                'wgStructuredChangeFiltersCollapsedPreferenceName',
                                static::$collapsedPreferenceName
                        );
-
-                       $out->addJsConfigVars(
-                               'StructuredChangeFiltersLiveUpdatePollingRate',
-                               $this->getConfig()->get( 'StructuredChangeFiltersLiveUpdatePollingRate' )
-                       );
                } else {
                        $out->addBodyClasses( 'mw-rcfilters-disabled' );
                }
        }
 
+       /**
+        * Get config vars to export with the mediawiki.rcfilters.filters.ui module.
+        *
+        * @param ResourceLoaderContext $context
+        * @return array
+        */
+       public static function getRcFiltersConfigVars( ResourceLoaderContext $context ) {
+               return [
+                       'RCFiltersChangeTags' => self::getChangeTagList( $context ),
+                       'StructuredChangeFiltersEditWatchlistUrl' =>
+                               SpecialPage::getTitleFor( 'EditWatchlist' )->getLocalURL()
+               ];
+       }
+
        /**
         * Fetch the change tags list for the front end
         *
+        * @param ResourceLoaderContext $context
         * @return array Tag data
         */
-       protected function getChangeTagList() {
+       protected static function getChangeTagList( ResourceLoaderContext $context ) {
                $cache = ObjectCache::getMainWANInstance();
-               $context = $this->getContext();
                return $cache->getWithSetCallback(
-                       $cache->makeKey( 'changeslistspecialpage-changetags', $context->getLanguage()->getCode() ),
+                       $cache->makeKey( 'changeslistspecialpage-changetags', $context->getLanguage() ),
                        $cache::TTL_MINUTE * 10,
                        function () use ( $context ) {
                                $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
@@ -858,6 +863,10 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                */
                                $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags );
 
+                               // HACK work around ChangeTags::truncateTagDescription() requiring a RequestContext
+                               $fakeContext = RequestContext::newExtraneousContext( Title::newFromText( 'Dwimmerlaik' ) );
+                               $fakeContext->setLanguage( Language::factory( $context->getLanguage() ) );
+
                                // Build the list and data
                                $result = [];
                                foreach ( $tagHitCounts as $tagName => $hits ) {
@@ -875,7 +884,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                                ChangeTags::truncateTagDescription(
                                                                        $tagName,
                                                                        self::TAG_DESC_CHARACTER_LIMIT,
-                                                                       $context
+                                                                       $fakeContext
                                                                ),
                                                        'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ),
                                                        'hits' => $hits,
index 0fc6e13..971aa43 100644 (file)
@@ -102,11 +102,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                if ( $this->isStructuredFilterUiEnabled() ) {
                        $output->addModuleStyles( [ 'mediawiki.rcfilters.highlightCircles.seenunseen.styles' ] );
-
-                       $output->addJsConfigVars(
-                               'wgStructuredChangeFiltersEditWatchlistUrl',
-                               SpecialPage::getTitleFor( 'EditWatchlist' )->getLocalURL()
-                       );
                }
        }
 
index 9293063..a19926d 100644 (file)
@@ -1816,6 +1816,7 @@ return [
                        'dm/ItemModel.js',
                        'dm/SavedQueriesModel.js',
                        'dm/SavedQueryItemModel.js',
+                       'config.json' => [ 'config' => [ 'StructuredChangeFiltersLiveUpdatePollingRate' ] ],
                ],
                'dependencies' => [
                        'mediawiki.String',
@@ -1869,6 +1870,7 @@ return [
                        'ui/RclTargetPageWidget.js',
                        'ui/RclToOrFromWidget.js',
                        'ui/WatchlistTopSectionWidget.js',
+                       'config.json' => [ 'callback' => 'ChangesListSpecialPage::getRcFiltersConfigVars' ],
                ],
                'styles' => [
                        'styles/mw.rcfilters.mixins.less',
index 30d4a90..56a95eb 100644 (file)
@@ -33,6 +33,8 @@
                this.collapsedPreferenceName = config.collapsedPreferenceName;
                this.normalizeTarget = !!config.normalizeTarget;
 
+               this.pollingRate = require( './config.json' ).StructuredChangeFiltersLiveUpdatePollingRate;
+
                this.requestCounter = {};
                this.baseFilterState = {};
                this.uriProcessor = null;
                this.initialized = true;
                this.switchView( 'default' );
 
-               this.pollingRate = mw.config.get( 'StructuredChangeFiltersLiveUpdatePollingRate' );
                if ( this.pollingRate ) {
                        this._scheduleLiveUpdate();
                }
index 4e0d3da..a69dc55 100644 (file)
                        mw.config.get( 'wgStructuredChangeFilters' ),
                        // All namespaces without Media namespace
                        getNamespaces( [ 'Media' ] ),
-                       mw.config.get( 'wgRCFiltersChangeTags' ),
+                       require( './config.json' ).RCFiltersChangeTags,
                        conditionalViews
                );
 
index 2674cc2..cb297f6 100644 (file)
@@ -90,7 +90,7 @@
                                this.numChangesAndDateWidget.$element
                        );
 
-               if ( mw.config.get( 'StructuredChangeFiltersLiveUpdatePollingRate' ) ) {
+               if ( this.controller.pollingRate ) {
                        $bottom.prepend( this.liveUpdateButton.$element );
                }
 
index a1c9776..16c0533 100644 (file)
@@ -30,7 +30,7 @@
                editWatchlistButton = new OO.ui.ButtonWidget( {
                        label: mw.msg( 'rcfilters-watchlist-edit-watchlist-button' ),
                        icon: 'edit',
-                       href: mw.config.get( 'wgStructuredChangeFiltersEditWatchlistUrl' )
+                       href: require( '../config.json' ).StructuredChangeFiltersEditWatchlistUrl
                } );
                markSeenButton = new MarkSeenButtonWidget( controller, changesListModel );