From: Timo Tijhof Date: Fri, 11 May 2018 15:18:23 +0000 (+0100) Subject: mediawiki.special.watchlist: Combine visitedstatus module X-Git-Tag: 1.34.0-rc.0~5410^2 X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=b07b326476ef3db1b9d1130b00289ab03587a56d mediawiki.special.watchlist: Combine visitedstatus module The 'mediawiki.special.changeslist.visitedstatus' module is only used in SpecialWatchlist.php, which also always loads 'mediawiki.special.watchlist'. Thus, registering them as seperate deliverables isn't needed. In terms of size, they're also sufficiently small that even if they could load under different conditions, it'd fine to load as one module regardless. Bug: T192623 Change-Id: I67d78083ce7a3000c05356e3eb0bcb98d0c1e990 --- diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php index 746084eabb..ea73347c1f 100644 --- a/includes/specials/SpecialWatchlist.php +++ b/includes/specials/SpecialWatchlist.php @@ -62,7 +62,6 @@ class SpecialWatchlist extends ChangesListSpecialPage { $this->addHelpLink( 'Help:Watching pages' ); $output->addModuleStyles( [ 'mediawiki.special' ] ); $output->addModules( [ - 'mediawiki.special.changeslist.visitedstatus', 'mediawiki.special.watchlist', ] ); diff --git a/resources/Resources.php b/resources/Resources.php index cdd225dde9..f0e97b7912 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -2119,9 +2119,6 @@ return [ ], 'targets' => [ 'desktop', 'mobile' ], ], - 'mediawiki.special.changeslist.visitedstatus' => [ - 'scripts' => 'resources/src/mediawiki.special.changeslist.visitedstatus.js', - ], 'mediawiki.special.contributions' => [ 'scripts' => 'resources/src/mediawiki.special.contributions.js', 'dependencies' => [ @@ -2352,7 +2349,10 @@ return [ ], ], 'mediawiki.special.watchlist' => [ - 'scripts' => 'resources/src/mediawiki.special.watchlist.js', + 'scripts' => [ + 'resources/src/mediawiki.special.watchlist/watchlist.js', + 'resources/src/mediawiki.special.watchlist/visitedstatus.js', + ], 'messages' => [ 'addedwatchtext', 'addedwatchtext-talk', diff --git a/resources/src/mediawiki.special.changeslist.visitedstatus.js b/resources/src/mediawiki.special.changeslist.visitedstatus.js deleted file mode 100644 index 6b25327d95..0000000000 --- a/resources/src/mediawiki.special.changeslist.visitedstatus.js +++ /dev/null @@ -1,12 +0,0 @@ -/*! - * JavaScript for Special:Watchlist - */ -( function ( $ ) { - $( function () { - $( '.mw-changeslist-line-watched .mw-title a' ).on( 'click', function () { - $( this ) - .closest( '.mw-changeslist-line-watched' ) - .removeClass( 'mw-changeslist-line-watched' ); - } ); - } ); -}( jQuery ) ); diff --git a/resources/src/mediawiki.special.watchlist.js b/resources/src/mediawiki.special.watchlist.js deleted file mode 100644 index 565ed2c974..0000000000 --- a/resources/src/mediawiki.special.watchlist.js +++ /dev/null @@ -1,158 +0,0 @@ -/*! - * JavaScript for Special:Watchlist - */ -( function ( mw, $, OO ) { - $( function () { - var api = new mw.Api(), $progressBar, $resetForm = $( '#mw-watchlist-resetbutton' ); - - // If the user wants to reset their watchlist, use an API call to do so (no reload required) - // Adapted from a user script by User:NQ of English Wikipedia - // (User:NQ/WatchlistResetConfirm.js) - $resetForm.submit( function ( event ) { - var $button = $resetForm.find( 'input[name=mw-watchlist-reset-submit]' ); - - event.preventDefault(); - - // Disable reset button to prevent multiple concurrent requests - $button.prop( 'disabled', true ); - - if ( !$progressBar ) { - $progressBar = new OO.ui.ProgressBarWidget( { progress: false } ).$element; - $progressBar.css( { - position: 'absolute', width: '100%' - } ); - } - // Show progress bar - $resetForm.append( $progressBar ); - - // Use action=setnotificationtimestamp to mark all as visited, - // then set all watchlist lines accordingly - api.postWithToken( 'csrf', { - formatversion: 2, action: 'setnotificationtimestamp', entirewatchlist: true - } ).done( function () { - // Enable button again - $button.prop( 'disabled', false ); - // Hide the button because further clicks can not generate any visual changes - $button.css( 'visibility', 'hidden' ); - $progressBar.detach(); - $( '.mw-changeslist-line-watched' ) - .removeClass( 'mw-changeslist-line-watched' ) - .addClass( 'mw-changeslist-line-not-watched' ); - } ).fail( function () { - // On error, fall back to server-side reset - // First remove this submit listener and then re-submit the form - $resetForm.off( 'submit' ).submit(); - } ); - } ); - - // if the user wishes to reload the watchlist whenever a filter changes - if ( mw.user.options.get( 'watchlistreloadautomatically' ) ) { - // add a listener on all form elements in the header form - $( '#mw-watchlist-form input, #mw-watchlist-form select' ).on( 'change', function () { - // submit the form when one of the input fields is modified - $( '#mw-watchlist-form' ).submit(); - } ); - } - - if ( mw.user.options.get( 'watchlistunwatchlinks' ) ) { - // Watch/unwatch toggle link: - // If a page is on the watchlist, a '×' is shown which, when clicked, removes the page from the watchlist. - // After unwatching a page, the '×' becomes a '+', which if clicked re-watches the page. - // Unwatched page entries are struck through and have lowered opacity. - $( '.mw-changeslist' ).on( 'click', '.mw-unwatch-link, .mw-watch-link', function ( event ) { - var $unwatchLink = $( this ), // EnhancedChangesList uses for each row, while OldChangesList uses
  • for each row - $watchlistLine = $unwatchLink.closest( 'li, table' ) - .find( '[data-target-page]' ), - pageTitle = $watchlistLine.data( 'targetPage' ), - isTalk = mw.Title.newFromText( pageTitle ).getNamespaceId() % 2 === 1; - - // Utility function for looping through each watchlist line that matches - // a certain page or its associated page (e.g. Talk) - function forEachMatchingTitle( title, callback ) { - - var titleObj = mw.Title.newFromText( title ), - pageNamespaceId = titleObj.getNamespaceId(), - isTalk = pageNamespaceId % 2 === 1, - associatedTitle = mw.Title.makeTitle( isTalk ? pageNamespaceId - 1 : pageNamespaceId + 1, - titleObj.getMainText() ).getPrefixedText(); - $( '.mw-changeslist-line' ).each( function () { - var $this = $( this ), $row, $unwatchLink; - - $this.find( '[data-target-page]' ).each( function () { - var $this = $( this ), rowTitle = $this.data( 'targetPage' ); - if ( rowTitle === title || rowTitle === associatedTitle ) { - - // EnhancedChangesList groups log entries by performer rather than target page. Therefore... - // * If using OldChangesList, use the
  • - // * If using EnhancedChangesList and $this is part of a grouped log entry, use the
  • sub-entry - // * If using EnhancedChangesList and $this is not part of a grouped log entry, use the grouped entry - $row = - $this.closest( - 'li, table.mw-collapsible.mw-changeslist-log td[data-target-page], table' ); - $unwatchLink = $row.find( '.mw-unwatch-link, .mw-watch-link' ); - - callback( rowTitle, $row, $unwatchLink ); - } - } ); - } ); - } - - // Preload the notification module for mw.notify - mw.loader.load( 'mediawiki.notification' ); - - // Depending on whether we are watching or unwatching, for each entry of the page (and its associated page i.e. Talk), - // change the text, tooltip, and non-JS href of the (un)watch button, and update the styling of the watchlist entry. - if ( $unwatchLink.hasClass( 'mw-unwatch-link' ) ) { - api.unwatch( pageTitle ) - .done( function () { - forEachMatchingTitle( pageTitle, - function ( rowPageTitle, $row, $rowUnwatchLink ) { - $rowUnwatchLink - .text( mw.msg( 'watchlist-unwatch-undo' ) ) - .attr( 'title', mw.msg( 'tooltip-ca-watch' ) ) - .attr( 'href', - mw.util.getUrl( rowPageTitle, { action: 'watch' } ) ) - .removeClass( 'mw-unwatch-link loading' ) - .addClass( 'mw-watch-link' ); - $row.find( - '.mw-changeslist-line-inner, .mw-enhanced-rc-nested' ) - .addBack( '.mw-enhanced-rc-nested' ) // For matching log sub-entry - .addClass( 'mw-changelist-line-inner-unwatched' ); - } ); - - mw.notify( - mw.message( isTalk ? 'removedwatchtext-talk' : 'removedwatchtext', - pageTitle ), { tag: 'watch-self' } ); - } ); - } else { - api.watch( pageTitle ) - .then( function () { - forEachMatchingTitle( pageTitle, - function ( rowPageTitle, $row, $rowUnwatchLink ) { - $rowUnwatchLink - .text( mw.msg( 'watchlist-unwatch' ) ) - .attr( 'title', mw.msg( 'tooltip-ca-unwatch' ) ) - .attr( 'href', - mw.util.getUrl( rowPageTitle, { action: 'unwatch' } ) ) - .removeClass( 'mw-watch-link loading' ) - .addClass( 'mw-unwatch-link' ); - $row.find( '.mw-changelist-line-inner-unwatched' ) - .addBack( '.mw-enhanced-rc-nested' ) - .removeClass( 'mw-changelist-line-inner-unwatched' ); - } ); - - mw.notify( - mw.message( isTalk ? 'addedwatchtext-talk' : 'addedwatchtext', - pageTitle ), { tag: 'watch-self' } ); - } ); - } - - event.preventDefault(); - event.stopPropagation(); - $unwatchLink.blur(); - } ); - } - } ); - -}( mediaWiki, jQuery, OO ) -); diff --git a/resources/src/mediawiki.special.watchlist/visitedstatus.js b/resources/src/mediawiki.special.watchlist/visitedstatus.js new file mode 100644 index 0000000000..6b25327d95 --- /dev/null +++ b/resources/src/mediawiki.special.watchlist/visitedstatus.js @@ -0,0 +1,12 @@ +/*! + * JavaScript for Special:Watchlist + */ +( function ( $ ) { + $( function () { + $( '.mw-changeslist-line-watched .mw-title a' ).on( 'click', function () { + $( this ) + .closest( '.mw-changeslist-line-watched' ) + .removeClass( 'mw-changeslist-line-watched' ); + } ); + } ); +}( jQuery ) ); diff --git a/resources/src/mediawiki.special.watchlist/watchlist.js b/resources/src/mediawiki.special.watchlist/watchlist.js new file mode 100644 index 0000000000..565ed2c974 --- /dev/null +++ b/resources/src/mediawiki.special.watchlist/watchlist.js @@ -0,0 +1,158 @@ +/*! + * JavaScript for Special:Watchlist + */ +( function ( mw, $, OO ) { + $( function () { + var api = new mw.Api(), $progressBar, $resetForm = $( '#mw-watchlist-resetbutton' ); + + // If the user wants to reset their watchlist, use an API call to do so (no reload required) + // Adapted from a user script by User:NQ of English Wikipedia + // (User:NQ/WatchlistResetConfirm.js) + $resetForm.submit( function ( event ) { + var $button = $resetForm.find( 'input[name=mw-watchlist-reset-submit]' ); + + event.preventDefault(); + + // Disable reset button to prevent multiple concurrent requests + $button.prop( 'disabled', true ); + + if ( !$progressBar ) { + $progressBar = new OO.ui.ProgressBarWidget( { progress: false } ).$element; + $progressBar.css( { + position: 'absolute', width: '100%' + } ); + } + // Show progress bar + $resetForm.append( $progressBar ); + + // Use action=setnotificationtimestamp to mark all as visited, + // then set all watchlist lines accordingly + api.postWithToken( 'csrf', { + formatversion: 2, action: 'setnotificationtimestamp', entirewatchlist: true + } ).done( function () { + // Enable button again + $button.prop( 'disabled', false ); + // Hide the button because further clicks can not generate any visual changes + $button.css( 'visibility', 'hidden' ); + $progressBar.detach(); + $( '.mw-changeslist-line-watched' ) + .removeClass( 'mw-changeslist-line-watched' ) + .addClass( 'mw-changeslist-line-not-watched' ); + } ).fail( function () { + // On error, fall back to server-side reset + // First remove this submit listener and then re-submit the form + $resetForm.off( 'submit' ).submit(); + } ); + } ); + + // if the user wishes to reload the watchlist whenever a filter changes + if ( mw.user.options.get( 'watchlistreloadautomatically' ) ) { + // add a listener on all form elements in the header form + $( '#mw-watchlist-form input, #mw-watchlist-form select' ).on( 'change', function () { + // submit the form when one of the input fields is modified + $( '#mw-watchlist-form' ).submit(); + } ); + } + + if ( mw.user.options.get( 'watchlistunwatchlinks' ) ) { + // Watch/unwatch toggle link: + // If a page is on the watchlist, a '×' is shown which, when clicked, removes the page from the watchlist. + // After unwatching a page, the '×' becomes a '+', which if clicked re-watches the page. + // Unwatched page entries are struck through and have lowered opacity. + $( '.mw-changeslist' ).on( 'click', '.mw-unwatch-link, .mw-watch-link', function ( event ) { + var $unwatchLink = $( this ), // EnhancedChangesList uses
    for each row, while OldChangesList uses
  • for each row + $watchlistLine = $unwatchLink.closest( 'li, table' ) + .find( '[data-target-page]' ), + pageTitle = $watchlistLine.data( 'targetPage' ), + isTalk = mw.Title.newFromText( pageTitle ).getNamespaceId() % 2 === 1; + + // Utility function for looping through each watchlist line that matches + // a certain page or its associated page (e.g. Talk) + function forEachMatchingTitle( title, callback ) { + + var titleObj = mw.Title.newFromText( title ), + pageNamespaceId = titleObj.getNamespaceId(), + isTalk = pageNamespaceId % 2 === 1, + associatedTitle = mw.Title.makeTitle( isTalk ? pageNamespaceId - 1 : pageNamespaceId + 1, + titleObj.getMainText() ).getPrefixedText(); + $( '.mw-changeslist-line' ).each( function () { + var $this = $( this ), $row, $unwatchLink; + + $this.find( '[data-target-page]' ).each( function () { + var $this = $( this ), rowTitle = $this.data( 'targetPage' ); + if ( rowTitle === title || rowTitle === associatedTitle ) { + + // EnhancedChangesList groups log entries by performer rather than target page. Therefore... + // * If using OldChangesList, use the
  • + // * If using EnhancedChangesList and $this is part of a grouped log entry, use the
  • sub-entry + // * If using EnhancedChangesList and $this is not part of a grouped log entry, use the grouped entry + $row = + $this.closest( + 'li, table.mw-collapsible.mw-changeslist-log td[data-target-page], table' ); + $unwatchLink = $row.find( '.mw-unwatch-link, .mw-watch-link' ); + + callback( rowTitle, $row, $unwatchLink ); + } + } ); + } ); + } + + // Preload the notification module for mw.notify + mw.loader.load( 'mediawiki.notification' ); + + // Depending on whether we are watching or unwatching, for each entry of the page (and its associated page i.e. Talk), + // change the text, tooltip, and non-JS href of the (un)watch button, and update the styling of the watchlist entry. + if ( $unwatchLink.hasClass( 'mw-unwatch-link' ) ) { + api.unwatch( pageTitle ) + .done( function () { + forEachMatchingTitle( pageTitle, + function ( rowPageTitle, $row, $rowUnwatchLink ) { + $rowUnwatchLink + .text( mw.msg( 'watchlist-unwatch-undo' ) ) + .attr( 'title', mw.msg( 'tooltip-ca-watch' ) ) + .attr( 'href', + mw.util.getUrl( rowPageTitle, { action: 'watch' } ) ) + .removeClass( 'mw-unwatch-link loading' ) + .addClass( 'mw-watch-link' ); + $row.find( + '.mw-changeslist-line-inner, .mw-enhanced-rc-nested' ) + .addBack( '.mw-enhanced-rc-nested' ) // For matching log sub-entry + .addClass( 'mw-changelist-line-inner-unwatched' ); + } ); + + mw.notify( + mw.message( isTalk ? 'removedwatchtext-talk' : 'removedwatchtext', + pageTitle ), { tag: 'watch-self' } ); + } ); + } else { + api.watch( pageTitle ) + .then( function () { + forEachMatchingTitle( pageTitle, + function ( rowPageTitle, $row, $rowUnwatchLink ) { + $rowUnwatchLink + .text( mw.msg( 'watchlist-unwatch' ) ) + .attr( 'title', mw.msg( 'tooltip-ca-unwatch' ) ) + .attr( 'href', + mw.util.getUrl( rowPageTitle, { action: 'unwatch' } ) ) + .removeClass( 'mw-watch-link loading' ) + .addClass( 'mw-unwatch-link' ); + $row.find( '.mw-changelist-line-inner-unwatched' ) + .addBack( '.mw-enhanced-rc-nested' ) + .removeClass( 'mw-changelist-line-inner-unwatched' ); + } ); + + mw.notify( + mw.message( isTalk ? 'addedwatchtext-talk' : 'addedwatchtext', + pageTitle ), { tag: 'watch-self' } ); + } ); + } + + event.preventDefault(); + event.stopPropagation(); + $unwatchLink.blur(); + } ); + } + } ); + +}( mediaWiki, jQuery, OO ) +);