( 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 toplinksTitle, topLinksCookieName = 'rcfilters-toplinks-collapsed-state', topLinksCookie = mw.cookie.get( topLinksCookieName ), topLinksCookieValue = topLinksCookie || 'collapsed', widget = this; config = config || {}; // Parent mw.rcfilters.ui.RcTopSectionWidget.parent.call( this, config ); this.$topLinks = $topLinks; toplinksTitle = new OO.ui.ButtonWidget( { framed: false, indicator: topLinksCookieValue === 'collapsed' ? 'down' : 'up', flags: [ 'progressive' ], label: $( '' ).append( mw.message( 'rcfilters-other-review-tools' ).parse() ).contents() } ); this.$topLinks .makeCollapsible( { collapsed: topLinksCookieValue === 'collapsed', $customTogglers: toplinksTitle.$element } ) .on( 'beforeExpand.mw-collapsible', function () { mw.cookie.set( topLinksCookieName, 'expanded' ); toplinksTitle.setIndicator( 'up' ); widget.switchTopLinks( 'expanded' ); } ) .on( 'beforeCollapse.mw-collapsible', function () { mw.cookie.set( topLinksCookieName, 'collapsed' ); toplinksTitle.setIndicator( 'down' ); widget.switchTopLinks( 'collapsed' ); } ); this.$topLinks.find( '.mw-recentchanges-toplinks-title' ) .replaceWith( toplinksTitle.$element.removeAttr( 'tabIndex' ) ); // Create two positions for the toplinks to toggle between // in the table (first cell) or up above it this.$top = $( '
' ) .addClass( 'mw-rcfilters-ui-rcTopSectionWidget-topLinks-top' ); this.$tableTopLinks = $( '
' ) .addClass( 'mw-rcfilters-ui-cell' ) .addClass( 'mw-rcfilters-ui-rcTopSectionWidget-topLinks-table' ); // Initialize this.$element .addClass( 'mw-rcfilters-ui-rcTopSectionWidget' ) .append( $( '
' ) .addClass( 'mw-rcfilters-ui-table' ) .append( $( '
' ) .addClass( 'mw-rcfilters-ui-row' ) .append( this.$tableTopLinks, $( '
' ) .addClass( 'mw-rcfilters-ui-table-placeholder' ) .addClass( 'mw-rcfilters-ui-cell' ), !mw.user.isAnon() ? $( '
' ) .addClass( 'mw-rcfilters-ui-cell' ) .addClass( 'mw-rcfilters-ui-rcTopSectionWidget-savedLinks' ) .append( savedLinksListWidget.$element ) : null ) ) ); // Hack: For jumpiness reasons, this should be a sibling of -head $( '.rcfilters-head' ).before( this.$top ); // Initialize top links position widget.switchTopLinks( topLinksCookieValue ); }; /* Initialization */ OO.inheritClass( mw.rcfilters.ui.RcTopSectionWidget, OO.ui.Widget ); /** * Switch the top links widget from inside the table (when collapsed) * to the 'top' (when open) * * @param {string} [state] The state of the top links widget: 'expanded' or 'collapsed' */ mw.rcfilters.ui.RcTopSectionWidget.prototype.switchTopLinks = function ( state ) { state = state || 'expanded'; if ( state === 'expanded' ) { this.$top.append( this.$topLinks ); } else { this.$tableTopLinks.append( this.$topLinks ); } this.$topLinks.toggleClass( 'mw-recentchanges-toplinks-collapsed', state === 'collapsed' ); }; }( mediaWiki ) );