Add links to toggle checkbox selections in Special:Log
authorLuke Faraone <luke@faraone.cc>
Thu, 7 Jan 2016 17:18:35 +0000 (17:18 +0000)
committerKunal Mehta <legoktm@member.fsf.org>
Mon, 18 Jan 2016 06:49:05 +0000 (22:49 -0800)
This implements a new JavaScript module, mediawiki.checkboxtoggle.
The module is suitable to be reused in any other list of checkboxes.

Bug: T92230
Change-Id: I92141a7079fc7fcd7152ef418d82f4f7969b163b

includes/specials/SpecialLog.php
languages/i18n/en.json
languages/i18n/qqq.json
resources/Resources.php
resources/src/mediawiki/mediawiki.checkboxtoggle.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.checkboxtoggle.js [new file with mode: 0644]

index e44ce5f..28ff1c7 100644 (file)
@@ -258,6 +258,33 @@ class SpecialLog extends SpecialPage {
                                $this->msg( 'log-edit-tags' )->text()
                        ) . "\n";
                }
+
+               // Select: All, None, Invert
+               $links = array();
+               $links[] = Html::element(
+                       'a', array( 'href' => '#', 'id' => 'checkbox-all' ),
+                       $this->msg( 'checkbox-all' )->text()
+               );
+               $links[] = Html::element(
+                       'a', array( 'href' => '#', 'id' => 'checkbox-none' ),
+                       $this->msg( 'checkbox-none' )->text()
+               );
+               $links[] = Html::element(
+                       'a', array( 'href' => '#', 'id' => 'checkbox-invert' ),
+                       $this->msg( 'checkbox-invert' )->text()
+               );
+
+               $buttons .= Html::rawElement( 'p',
+                       array(
+                               'class' => "mw-checkbox-toggle-controls"
+                       ),
+                       $this->msg( 'checkbox-select' )
+                               ->rawParams( $this->getLanguage()->commaList( $links ) )->escaped()
+               );
+
+               $this->getOutput()->addModules( 'mediawiki.checkboxtoggle' );
+               $this->getOutput()->addModuleStyles( 'mediawiki.checkboxtoggle.styles' );
+
                $s .= $buttons . $formcontents . $buttons;
                $s .= Html::closeElement( 'form' );
 
index f1c354a..545fc34 100644 (file)
        "log-title-wildcard": "Search titles starting with this text",
        "showhideselectedlogentries": "Change visibility of selected log entries",
        "log-edit-tags": "Edit tags of selected log entries",
+       "checkbox-select": "Select: $1",
+       "checkbox-all": "All",
+       "checkbox-none": "None",
+       "checkbox-invert": "Invert",
        "allpages": "All pages",
        "allpages-summary": "",
        "nextpage": "Next page ($1)",
index 06f4fe6..406efb3 100644 (file)
        "log-title-wildcard": "* Appears in: [[Special:Log]]\n* Description: A check box to enable prefix search option",
        "showhideselectedlogentries": "Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu on [[Special:Log]].",
        "log-edit-tags": "Text of button used to access change tagging interface. For more information on tags see [[mw:Manual:Tags]].",
+        "checkbox-select": "Parameters:\n* $1 - three links: {{msg-mw|checkbox-all}}, {{msg-mw|checkbox-none}}, and {{msg-mw|checkbox-invert}} which respectively selects all pages, de-selects all, and inverts the current selection state\npages\n{{Identical|Select}}",
+       "checkbox-all": "Text of button used to mark all revisions or log entries as selected in a list.",
+       "checkbox-none": "Text of button used to mark all revisions or log entries as unselected in a list.",
+       "checkbox-invert": "Text of button used to invert the currently-selected-state of all revisions or log entries in a list.",
        "allpages": "{{doc-special|AllPages}}\nFirst part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]].\nThe other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.\n{{Identical|All pages}}",
        "allpages-summary": "{{doc-specialpagesummary|allpages}}",
        "nextpage": "Third part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Prevpage}}.\n\n{{Identical|Next page}}",
index 52a9564..cd9810c 100644 (file)
@@ -1342,6 +1342,14 @@ return array(
                'position' => 'top', // For $wgPreloadJavaScriptMwUtil
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.checkboxtoggle' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.checkboxtoggle.js',
+               'position' => 'top',
+       ),
+       'mediawiki.checkboxtoggle.styles' => array(
+               'styles' => 'resources/src/mediawiki/mediawiki.checkboxtoggle.css',
+               'position' => 'top',
+       ),
        'mediawiki.cookie' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.cookie.js',
                'dependencies' => 'jquery.cookie',
diff --git a/resources/src/mediawiki/mediawiki.checkboxtoggle.css b/resources/src/mediawiki/mediawiki.checkboxtoggle.css
new file mode 100644 (file)
index 0000000..3da0d43
--- /dev/null
@@ -0,0 +1,3 @@
+.client-nojs .mw-checkbox-toggle-controls {
+       display: none;
+}
diff --git a/resources/src/mediawiki/mediawiki.checkboxtoggle.js b/resources/src/mediawiki/mediawiki.checkboxtoggle.js
new file mode 100644 (file)
index 0000000..4be4a8d
--- /dev/null
@@ -0,0 +1,37 @@
+/*!
+ * Allows users to perform all / none / invert operations on a list of
+ * checkboxes on the page.
+ *
+ * @licence GNU GPL v2+
+ * @author Luke Faraone <luke at faraone dot cc>
+ *
+ * Based on ext.nuke.js from https://www.mediawiki.org/wiki/Extension:Nuke by
+ * Jeroen De Dauw <jeroendedauw at gmail dot com>
+ */
+
+( function ( mw, $ ) {
+       'use strict';
+
+       var $checkboxes = $( 'li input[type=checkbox]' );
+
+       function selectAll( check ) {
+               $checkboxes.prop( 'checked', check );
+       }
+
+       $( '#checkbox-all' ).click( function ( e ) {
+               selectAll( true );
+               e.preventDefault();
+       } );
+       $( '#checkbox-none' ).click( function ( e ) {
+               selectAll( false );
+               e.preventDefault();
+       } );
+       $( '#checkbox-invert' ).click( function ( e ) {
+               $checkboxes.each( function () {
+                       $( this ).prop( 'checked', !$( this ).is( ':checked' ) );
+               } );
+               e.preventDefault();
+       } );
+
+}( mediaWiki, jQuery ) );
+