Mattflaschen has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/375038 )

Change subject: WLFilters: convert 'edit watchlist' button to new UX
......................................................................

WLFilters: convert 'edit watchlist' button to new UX

Bug: T172030
Change-Id: Ifcde40c66fbb6543d4f2aebfc8499c03533b8b91
---
M includes/specials/SpecialWatchlist.php
M languages/i18n/en.json
M languages/i18n/qqq.json
M resources/Resources.php
M resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
M resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
M 
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
A 
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RcTopSectionWidget.less
M 
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less
A 
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.WatchlistTopSectionWidget.less
M resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
A resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RcTopSectionWidget.js
A 
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.WatchlistTopSectionWidget.js
13 files changed, 276 insertions(+), 107 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/38/375038/1

diff --git a/includes/specials/SpecialWatchlist.php 
b/includes/specials/SpecialWatchlist.php
index b20b331..131431b 100644
--- a/includes/specials/SpecialWatchlist.php
+++ b/includes/specials/SpecialWatchlist.php
@@ -102,6 +102,10 @@
                                
'wgStructuredChangeFiltersSavedQueriesPreferenceName',
                                'rcfilters-wl-saved-queries'
                        );
+                       $output->addJsConfigVars(
+                               'wgStructuredChangeFiltersEditWatchlistUrl',
+                               SpecialPage::getTitleFor( 'EditWatchlist' 
)->getLocalURL()
+                       );
                }
        }
 
@@ -793,21 +797,25 @@
                $showUpdatedMarker = $this->getConfig()->get( 
'ShowUpdatedMarker' );
 
                // Show watchlist header
-               $form .= "<p>";
+               $watchlistHeader = '';
                if ( $numItems == 0 ) {
-                       $form .= $this->msg( 'nowatchlist' )->parse() . "\n";
+                       $watchlistHeader = $this->msg( 'nowatchlist' )->parse();
                } else {
-                       $form .= $this->msg( 'watchlist-details' )->numParams( 
$numItems )->parse() . "\n";
+                       $watchlistHeader .= $this->msg( 'watchlist-details' 
)->numParams( $numItems )->parse() . "\n";
                        if ( $this->getConfig()->get( 'EnotifWatchlist' )
                                && $user->getOption( 'enotifwatchlistpages' )
                        ) {
-                               $form .= $this->msg( 'wlheader-enotif' 
)->parse() . "\n";
+                               $watchlistHeader .= $this->msg( 
'wlheader-enotif' )->parse() . "\n";
                        }
                        if ( $showUpdatedMarker ) {
-                               $form .= $this->msg( 'wlheader-showupdated' 
)->parse() . "\n";
+                               $watchlistHeader .= $this->msg( 
'wlheader-showupdated' )->parse() . "\n";
                        }
                }
-               $form .= "</p>";
+               $form .= Html::rawElement(
+                       'p',
+                       [ 'class' => 'watchlistDetails' ],
+                       $watchlistHeader
+               );
 
                if ( $numItems > 0 && $showUpdatedMarker ) {
                        $form .= Xml::openElement( 'form', [ 'method' => 'post',
diff --git a/languages/i18n/en.json b/languages/i18n/en.json
index a44b3cf..dae2c40 100644
--- a/languages/i18n/en.json
+++ b/languages/i18n/en.json
@@ -1469,6 +1469,7 @@
        "rcfilters-liveupdates-button-title-on": "Turn off live updates",
        "rcfilters-liveupdates-button-title-off": "Display new changes as they 
happen",
        "rcfilters-watchlist-markSeen-button": "Mark all changes as seen",
+       "rcfilters-watchlist-editWatchlist-button": "Edit your list of watched 
pages",
        "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since 
<strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfromreset": "Reset date selection",
        "rclistfrom": "Show new changes starting from $2, $3",
diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json
index 92c3a89..0dd613c 100644
--- a/languages/i18n/qqq.json
+++ b/languages/i18n/qqq.json
@@ -1659,6 +1659,7 @@
        "rcfilters-liveupdates-button-title-on": "Title for the button to 
enable or disable live updates on [[Special:RecentChanges]] when the feature is 
ON.",
        "rcfilters-liveupdates-button-title-off": "Title for the button to 
enable or disable live updates on [[Special:RecentChanges]] when the feature is 
OFF.",
        "rcfilters-watchlist-markSeen-button": "Label for the button to mark 
all changes as seen on [[Special:Watchlist]] when using the structured filters 
interface.",
+       "rcfilters-watchlist-editWatchlist-button": "Label for the button to 
edit the watched pages on [[Special:Watchlist]] when using the structured 
filters interface.",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] 
when viewing recentchanges from some specific time.\n\nThe corresponding 
message is {{msg-mw|Rclistfrom}}.\n\nParameters:\n* $1 - the maximum number of 
changes that are displayed\n* $2 - (Optional) a date and time\n* $3 - a date\n* 
$4 - a time\n* $5 - Number of changes are displayed, for use with PLURAL",
        "rclistfromreset": "Used on [[Special:RecentChanges]] to reset a 
selection of a certain date range.",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - 
(Currently not use) date and time. The date and the time adds to the rclistfrom 
description.\n* $2 - time. The time adds to the rclistfrom link description 
(with split of date and time).\n* $3 - date. The date adds to the rclistfrom 
link description (with split of date and time).\n\nThe corresponding message is 
{{msg-mw|Rcnotefrom}}.",
diff --git a/resources/Resources.php b/resources/Resources.php
index 89eab94..a1cf4d2 100644
--- a/resources/Resources.php
+++ b/resources/Resources.php
@@ -1796,6 +1796,8 @@
                        
'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js',
                        
'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.LiveUpdateButtonWidget.js',
                        
'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MarkSeenButtonWidget.js',
+                       
'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RcTopSectionWidget.js',
+                       
'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.WatchlistTopSectionWidget.js',
                        
'resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js',
                        
'resources/src/mediawiki.rcfilters/mw.rcfilters.init.js',
                ],
@@ -1823,6 +1825,8 @@
                        
'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less',
                        
'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less',
                        
'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.LiveUpdateButtonWidget.less',
+                       
'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RcTopSectionWidget.less',
+                       
'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.WatchlistTopSectionWidget.less',
                ],
                'skinStyles' => [
                        'monobook' => [
@@ -1889,6 +1893,7 @@
                        'rcfilters-liveupdates-button-title-on',
                        'rcfilters-liveupdates-button-title-off',
                        'rcfilters-watchlist-markSeen-button',
+                       'rcfilters-watchlist-editWatchlist-button',
                        'rcfilters-other-review-tools',
                        'blanknamespace',
                        'namespaces',
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js 
b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
index a6bce14..0819351 100644
--- a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
+++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
@@ -8,10 +8,10 @@
                 * @private
                 */
                init: function () {
-                       var toplinksTitle,
-                               topLinksCookieName = 
'rcfilters-toplinks-collapsed-state',
-                               topLinksCookie = mw.cookie.get( 
topLinksCookieName ),
-                               topLinksCookieValue = topLinksCookie || 
'collapsed',
+                       var $topLinks,
+                               rcTopSection,
+                               $watchlistDetails,
+                               wlTopSection,
                                savedQueriesPreferenceName = mw.config.get( 
'wgStructuredChangeFiltersSavedQueriesPreferenceName' ),
                                filtersModel = new 
mw.rcfilters.dm.FiltersViewModel(),
                                changesListModel = new 
mw.rcfilters.dm.ChangesListViewModel(),
@@ -26,7 +26,9 @@
                                        .addClass( 'mw-rcfilters-ui-overlay' ),
                                filtersWidget = new 
mw.rcfilters.ui.FilterWrapperWidget(
                                        controller, filtersModel, 
savedQueriesModel, changesListModel, { $overlay: $overlay } ),
-                               markSeenButton,
+                               savedLinksListWidget = new 
mw.rcfilters.ui.SavedLinksListWidget(
+                                       controller, savedQueriesModel, { 
$overlay: $overlay }
+                               ),
                                currentPage = mw.config.get( 
'wgCanonicalNamespace' ) +
                                        ':' +
                                        mw.config.get( 
'wgCanonicalSpecialPageName' );
@@ -59,36 +61,22 @@
                        controller.replaceUrl();
 
                        if ( currentPage === 'Special:Recentchanges' ) {
-                               toplinksTitle = new OO.ui.ButtonWidget( {
-                                       framed: false,
-                                       indicator: topLinksCookieValue === 
'collapsed' ? 'down' : 'up',
-                                       flags: [ 'progressive' ],
-                                       label: $( '<span>' ).append( 
mw.message( 'rcfilters-other-review-tools' ).parse() ).contents()
-                               } );
-                               $( '.mw-recentchanges-toplinks-title' 
).replaceWith( toplinksTitle.$element );
-                               // Move the top links to a designated area so 
it's near the
-                               // 'saved filters' button and make it 
collapsible
-                               $( '.mw-recentchanges-toplinks' )
-                                       .addClass( 'mw-rcfilters-ui-ready' )
-                                       .makeCollapsible( {
-                                               collapsed: topLinksCookieValue 
=== 'collapsed',
-                                               $customTogglers: 
toplinksTitle.$element
-                                       } )
-                                       .on( 'beforeExpand.mw-collapsible', 
function () {
-                                               mw.cookie.set( 
topLinksCookieName, 'expanded' );
-                                               toplinksTitle.setIndicator( 
'up' );
-                                       } )
-                                       .on( 'beforeCollapse.mw-collapsible', 
function () {
-                                               mw.cookie.set( 
topLinksCookieName, 'collapsed' );
-                                               toplinksTitle.setIndicator( 
'down' );
-                                       } )
-                                       .appendTo( 
'.mw-rcfilters-ui-filterWrapperWidget-top-placeholder' );
+                               $topLinks = $( '.mw-recentchanges-toplinks' 
).detach();
+
+                               rcTopSection = new 
mw.rcfilters.ui.RcTopSectionWidget(
+                                       savedLinksListWidget, $topLinks
+                               );
+                               filtersWidget.setTopSection( 
rcTopSection.$element );
                        } // end Special:RC
 
                        if ( currentPage === 'Special:Watchlist' ) {
-                               markSeenButton = new 
mw.rcfilters.ui.MarkSeenButtonWidget( controller, changesListModel );
-                               $( 'form#mw-watchlist-resetbutton' ).detach();
-                               filtersWidget.prependToTopRow( markSeenButton );
+                               $( '#contentSub, form#mw-watchlist-resetbutton' 
).detach();
+                               $watchlistDetails = $( '.watchlistDetails' 
).detach().contents();
+
+                               wlTopSection = new 
mw.rcfilters.ui.WatchlistTopSectionWidget(
+                                       controller, changesListModel, 
savedLinksListWidget, $watchlistDetails
+                               );
+                               filtersWidget.setTopSection( 
wlTopSection.$element );
                        } // end Special:WL
                }
        };
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less 
b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
index d5528e1..3a1ab53 100644
--- a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
+++ b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
@@ -7,29 +7,6 @@
                border: 0;
        }
 
-       .mw-recentchanges-toplinks {
-               padding: 0 0.5em;
-
-               
.oo-ui-widget-enabled.oo-ui-buttonElement.oo-ui-buttonElement-frameless 
.oo-ui-buttonElement-button {
-                       padding: 0 2.5em 0 0.5em;
-               }
-
-               &-title,
-               .mw-collapsible-text {
-                       // Same as the legend
-                       font-size: 0.85em;
-               }
-
-               &:not( .mw-collapsed ) {
-                       // Same as the legend
-                       border: 1px solid #ddd;
-               }
-
-               &:not( .mw-rcfilters-ui-ready ) {
-                       display: none;
-               }
-       }
-
        .rcfilters-head {
                min-height: 220px;
                margin-top: 1em;
@@ -93,6 +70,12 @@
                        .animation-delay( 0s );
                }
        }
+
+       #contentSub,
+       p.watchlistDetails,
+       form#mw-watchlist-resetbutton {
+               display: none;
+       }
 }
 
 .mw-rcfilters-staticfilters-selected {
diff --git 
a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
 
b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
index 87d09e0..df4592c 100644
--- 
a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
+++ 
b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
@@ -8,17 +8,6 @@
                margin-top: 1em;
        }
 
-       &-top {
-               &-placeholder {
-                       width: 100%;
-               }
-
-               &-savedLinks {
-                       padding-left: 1em;
-                       vertical-align: bottom;
-               }
-       }
-
        &-bottom {
                margin-top: 1em;
 
diff --git 
a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RcTopSectionWidget.less
 
b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RcTopSectionWidget.less
new file mode 100644
index 0000000..38f6f28
--- /dev/null
+++ 
b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RcTopSectionWidget.less
@@ -0,0 +1,33 @@
+.mw-rcfilters-ui-rcTopSectionWidget {
+       &-topLinks {
+               width: 100%;
+       }
+
+       &-savedLinks {
+               vertical-align: bottom;
+               padding-left: 1em;
+       }
+
+       .mw-recentchanges-toplinks {
+               padding: 0 0.5em;
+
+               
.oo-ui-widget-enabled.oo-ui-buttonElement.oo-ui-buttonElement-frameless 
.oo-ui-buttonElement-button {
+                       padding: 0 2.5em 0 0.5em;
+               }
+
+               &-title,
+               .mw-collapsible-text {
+                       // Same as the legend
+                       font-size: 0.85em;
+               }
+
+               &:not( .mw-collapsed ) {
+                       // Same as the legend
+                       border: 1px solid #ddd;
+               }
+
+               &:not( .mw-rcfilters-ui-ready ) {
+                       display: none;
+               }
+       }
+}
diff --git 
a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less
 
b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less
index 716ed03..2b713e1 100644
--- 
a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less
+++ 
b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less
@@ -1,6 +1,4 @@
 .mw-rcfilters-ui-savedLinksListWidget {
-       float: right;
-
        &-menu {
                width: 100%;
        }
diff --git 
a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.WatchlistTopSectionWidget.less
 
b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.WatchlistTopSectionWidget.less
new file mode 100644
index 0000000..bbe4528
--- /dev/null
+++ 
b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.WatchlistTopSectionWidget.less
@@ -0,0 +1,19 @@
+.mw-rcfilters-ui-watchlistTopSectionWidget {
+       &-editWatchlistButton {
+               float: right;
+               margin-left: 3em;
+       }
+
+       &-savedLinks {
+               float: right;
+       }
+
+       .mw-rcfilters-ui-table {
+               margin-top: 1em;
+       }
+
+       &-separator {
+               margin-top: 1em;
+               border-top: 2px solid #eaecf0; // Base80 AAA
+       }
+}
diff --git 
a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js 
b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
index c3af7c5..75b4739 100644
--- 
a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
+++ 
b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
@@ -17,7 +17,7 @@
        mw.rcfilters.ui.FilterWrapperWidget = function 
MwRcfiltersUiFilterWrapperWidget(
                controller, model, savedQueriesModel, changesListModel, config
        ) {
-               var $top, $bottom;
+               var $bottom;
                config = config || {};
 
                // Parent
@@ -59,17 +59,8 @@
                );
 
                // Initialize
-               this.$topRow = $( '<div>' )
-                       .addClass( 'mw-rcfilters-ui-row' )
-                       .append(
-                               $( '<div>' )
-                                       .addClass( 'mw-rcfilters-ui-cell' )
-                                       .addClass( 
'mw-rcfilters-ui-filterWrapperWidget-top-placeholder' )
-                       );
-               $top = $( '<div>' )
-                       .addClass( 'mw-rcfilters-ui-filterWrapperWidget-top' )
-                       .addClass( 'mw-rcfilters-ui-table' )
-                       .append( this.$topRow );
+               this.$top = $( '<div>' )
+                       .addClass( 'mw-rcfilters-ui-filterWrapperWidget-top' );
 
                $bottom = $( '<div>' )
                        .addClass( 'mw-rcfilters-ui-filterWrapperWidget-bottom' 
)
@@ -78,18 +69,19 @@
                                this.dateWidget.$element
                        );
 
-               this.savedLinksListWidget = new 
mw.rcfilters.ui.SavedLinksListWidget(
-                       this.controller,
-                       this.queriesModel,
-                       { $overlay: this.$overlay }
-               );
-
-               this.$topRow.append(
-                       $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-cell' )
-                               .addClass( 
'mw-rcfilters-ui-filterWrapperWidget-top-savedLinks' )
-                               .append( this.savedLinksListWidget.$element )
-               );
+               if ( !mw.user.isAnon() ) {
+                       this.savedLinksListWidget = new 
mw.rcfilters.ui.SavedLinksListWidget(
+                               this.controller,
+                               this.queriesModel,
+                               { $overlay: this.$overlay }
+                       );
+                       this.$topRow.append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                       .addClass( 
'mw-rcfilters-ui-filterWrapperWidget-top-savedLinks' )
+                                       .append( 
this.savedLinksListWidget.$element )
+                       );
+               }
 
                if ( mw.rcfilters.featureFlags.liveUpdate ) {
                        $bottom.append( this.liveUpdateButton.$element );
@@ -98,7 +90,7 @@
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterWrapperWidget' )
                        .append(
-                               $top,
+                               this.$top,
                                this.filterTagWidget.$element,
                                $bottom
                        );
@@ -112,15 +104,11 @@
        /* Methods */
 
        /**
-        * Add a widget at the beginning of the top row
+        * Set the content of the top section
         *
-        * @param {OO.ui.Widget} widget Any widget
+        * @param {jQuery} $topSectionElement
         */
-       mw.rcfilters.ui.FilterWrapperWidget.prototype.prependToTopRow = 
function ( widget ) {
-               this.$topRow.prepend(
-                       widget.$element
-                               .addClass( 'mw-rcfilters-ui-cell' )
-               );
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.setTopSection = function 
( $topSectionElement ) {
+               this.$top.append( $topSectionElement );
        };
-
 }( mediaWiki ) );
diff --git 
a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RcTopSectionWidget.js 
b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RcTopSectionWidget.js
new file mode 100644
index 0000000..706c888
--- /dev/null
+++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RcTopSectionWidget.js
@@ -0,0 +1,74 @@
+( function ( mw ) {
+       /**
+        * Top section (between page title and filters) on Special:Recentchanges
+        *
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {mw.rcfilters.ui.SavedLinksListWidget} savedLinksListWidget
+        * @param {jQuery} $topLinks Content of the community-defined links
+        * @param {Object} [config] Configuration object
+        */
+       mw.rcfilters.ui.RcTopSectionWidget = function 
MwRcfiltersUiRcTopSectionWidget(
+               savedLinksListWidget, $topLinks, config
+       ) {
+               var topLinksCookieName = 'rcfilters-toplinks-collapsed-state',
+                       topLinksCookie = mw.cookie.get( topLinksCookieName ),
+                       topLinksCookieValue = topLinksCookie || 'collapsed',
+                       toplinksTitle;
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.RcTopSectionWidget.parent.call( this, config );
+
+               toplinksTitle = new OO.ui.ButtonWidget( {
+                       framed: false,
+                       indicator: topLinksCookieValue === 'collapsed' ? 'down' 
: 'up',
+                       flags: [ 'progressive' ],
+                       label: $( '<span>' ).append( mw.message( 
'rcfilters-other-review-tools' ).parse() ).contents()
+               } );
+
+               $topLinks
+                       .addClass( 'mw-rcfilters-ui-ready' )
+                       .makeCollapsible( {
+                               collapsed: topLinksCookieValue === 'collapsed',
+                               $customTogglers: toplinksTitle.$element
+                       } )
+                       .on( 'beforeExpand.mw-collapsible', function () {
+                               mw.cookie.set( topLinksCookieName, 'expanded' );
+                               toplinksTitle.setIndicator( 'up' );
+                       } )
+                       .on( 'beforeCollapse.mw-collapsible', function () {
+                               mw.cookie.set( topLinksCookieName, 'collapsed' 
);
+                               toplinksTitle.setIndicator( 'down' );
+                       } );
+
+               $topLinks.find( '.mw-recentchanges-toplinks-title' 
).replaceWith( toplinksTitle.$element );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-rcTopSectionWidget' )
+                       .addClass( 'mw-rcfilters-ui-table' )
+                       .append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-row' )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 
'mw-rcfilters-ui-cell' )
+                                                       .addClass( 
'mw-rcfilters-ui-rcTopSectionWidget-topLinks' )
+                                                       .append( $topLinks )
+                                       )
+                                       .append(
+                                               !mw.user.isAnon() ?
+                                                       $( '<div>' )
+                                                               .addClass( 
'mw-rcfilters-ui-cell' )
+                                                               .addClass( 
'mw-rcfilters-ui-rcTopSectionWidget-savedLinks' )
+                                                               .append( 
savedLinksListWidget.$element ) :
+                                                       null
+                                       )
+                       );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.RcTopSectionWidget, OO.ui.Widget );
+}( mediaWiki ) );
diff --git 
a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.WatchlistTopSectionWidget.js
 
b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.WatchlistTopSectionWidget.js
new file mode 100644
index 0000000..86c206b
--- /dev/null
+++ 
b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.WatchlistTopSectionWidget.js
@@ -0,0 +1,82 @@
+( function ( mw ) {
+       /**
+        * Top section (between page title and filters) on Special:Watchlist
+        *
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller
+        * @param {mw.rcfilters.dm.ChangesListViewModel} changesListModel
+        * @param {mw.rcfilters.ui.SavedLinksListWidget} savedLinksListWidget
+        * @param {jQuery} $watchlistDetails Content of the 'details' section 
that includes watched pages count
+        * @param {Object} [config] Configuration object
+        */
+       mw.rcfilters.ui.WatchlistTopSectionWidget = function 
MwRcfiltersUiWatchlistTopSectionWidget(
+               controller, changesListModel, savedLinksListWidget, 
$watchlistDetails, config
+       ) {
+               var editWatchlistButton,
+                       markSeenButton,
+                       $topTable,
+                       $bottomTable,
+                       $separator;
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.WatchlistTopSectionWidget.parent.call( this, 
config );
+
+               editWatchlistButton = new OO.ui.ButtonWidget( {
+                       label: mw.msg( 
'rcfilters-watchlist-editWatchlist-button' ),
+                       icon: 'edit',
+                       href: mw.config.get( 
'wgStructuredChangeFiltersEditWatchlistUrl' )
+               } );
+               markSeenButton = new mw.rcfilters.ui.MarkSeenButtonWidget( 
controller, changesListModel );
+
+               $topTable = $( '<div>' )
+                       .addClass( 'mw-rcfilters-ui-table' )
+                       .append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-row' )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 
'mw-rcfilters-ui-cell' )
+                                                       .addClass( 
'mw-rcfilters-ui-watchlistTopSectionWidget-watchlistDetails' )
+                                                       .append( 
$watchlistDetails )
+                                       )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 
'mw-rcfilters-ui-cell' )
+                                                       .addClass( 
'mw-rcfilters-ui-watchlistTopSectionWidget-editWatchlistButton' )
+                                                       .append( 
editWatchlistButton.$element )
+                                       )
+                       );
+
+               $bottomTable = $( '<div>' )
+                       .addClass( 'mw-rcfilters-ui-table' )
+                       .append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-row' )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 
'mw-rcfilters-ui-cell' )
+                                                       .append( 
markSeenButton.$element )
+                                       )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 
'mw-rcfilters-ui-cell' )
+                                                       .addClass( 
'mw-rcfilters-ui-watchlistTopSectionWidget-savedLinks' )
+                                                       .append( 
savedLinksListWidget.$element )
+                                       )
+                       );
+
+               $separator = $( '<div>' )
+                       .addClass( 
'mw-rcfilters-ui-watchlistTopSectionWidget-separator' );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-watchlistTopSectionWidget' )
+                       .append( $topTable, $separator, $bottomTable );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.WatchlistTopSectionWidget, 
OO.ui.Widget );
+}( mediaWiki ) );

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifcde40c66fbb6543d4f2aebfc8499c03533b8b91
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: wmf/1.30.0-wmf.15
Gerrit-Owner: Mattflaschen <mflasc...@wikimedia.org>
Gerrit-Reviewer: Sbisson <sbis...@wikimedia.org>

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

Reply via email to