Date range filtering in Special:NewFiles
authorGeoffrey Mon <geofbot@gmail.com>
Mon, 12 Dec 2016 17:01:02 +0000 (12:01 -0500)
committerSn1per <geofbot@gmail.com>
Fri, 12 May 2017 13:26:44 +0000 (13:26 +0000)
Bug: T13836
Change-Id: I6149a081db2494a36a715259b76a0c0470149b8c

includes/specials/SpecialNewimages.php
includes/specials/pagers/NewFilesPager.php
resources/Resources.php
resources/src/mediawiki.special/mediawiki.special.newFiles.js [new file with mode: 0644]

index 12dae8b..583d4f9 100644 (file)
@@ -34,6 +34,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
                $this->outputHeader();
 
                $out = $this->getOutput();
+               $out->addModules( 'mediawiki.special.newFiles' );
                $this->addHelpLink( 'Help:New images' );
 
                $opts = new FormOptions();
@@ -44,6 +45,8 @@ class SpecialNewFiles extends IncludableSpecialPage {
                $opts->add( 'hidepatrolled', false );
                $opts->add( 'limit', 50 );
                $opts->add( 'offset', '' );
+               $opts->add( 'start', '' );
+               $opts->add( 'end', '' );
 
                $opts->fetchValuesFromRequest( $this->getRequest() );
 
@@ -51,6 +54,19 @@ class SpecialNewFiles extends IncludableSpecialPage {
                        $opts->setValue( is_numeric( $par ) ? 'limit' : 'like', $par );
                }
 
+               // If start date comes after end date chronologically, swap them.
+               // They are swapped in the interface by JS.
+               $start = $opts->getValue( 'start' );
+               $end = $opts->getValue( 'end' );
+               if ( $start !== '' && $end !== '' && $start > $end ) {
+                       $temp = $end;
+                       $end = $start;
+                       $start = $temp;
+
+                       $opts->setValue( 'start', $start, true );
+                       $opts->setValue( 'end', $end, true );
+               }
+
                $opts->validateIntBounds( 'limit', 0, 500 );
 
                $this->opts = $opts;
@@ -105,6 +121,18 @@ class SpecialNewFiles extends IncludableSpecialPage {
                                'default' => $this->opts->getValue( 'offset' ),
                                'name' => 'offset',
                        ],
+
+                       'start' => [
+                               'type' => 'date',
+                               'label-message' => 'date-range-from',
+                               'name' => 'start',
+                       ],
+
+                       'end' => [
+                               'type' => 'date',
+                               'label-message' => 'date-range-to',
+                               'name' => 'end',
+                       ],
                ];
 
                if ( $this->getConfig()->get( 'MiserMode' ) ) {
index e2d9d42..cce0323 100644 (file)
@@ -24,7 +24,7 @@
  */
 use MediaWiki\MediaWikiServices;
 
-class NewFilesPager extends ReverseChronologicalPager {
+class NewFilesPager extends RangeChronologicalPager {
 
        /**
         * @var ImageGalleryBase
@@ -41,11 +41,20 @@ class NewFilesPager extends ReverseChronologicalPager {
         * @param FormOptions $opts
         */
        function __construct( IContextSource $context, FormOptions $opts ) {
-               $this->opts = $opts;
+               parent::__construct( $context );
 
+               $this->opts = $opts;
                $this->setLimit( $opts->getValue( 'limit' ) );
 
-               parent::__construct( $context );
+               $startTimestamp = '';
+               $endTimestamp = '';
+               if ( $opts->getValue( 'start' ) ) {
+                       $startTimestamp = $opts->getValue( 'start' ) . ' 00:00:00';
+               }
+               if ( $opts->getValue( 'end' ) ) {
+                       $endTimestamp = $opts->getValue( 'end' ) . ' 23:59:59';
+               }
+               $this->getDateRangeCond( $startTimestamp, $endTimestamp );
        }
 
        function getQueryInfo() {
index e8c8f61..8071bd9 100644 (file)
@@ -1978,6 +1978,12 @@ return [
        'mediawiki.special.movePage.styles' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.movePage.css',
        ],
+       'mediawiki.special.newFiles' => [
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.newFiles.js',
+               'dependencies' => [
+                       'mediawiki.widgets.datetime',
+               ],
+       ],
        'mediawiki.special.pageLanguage' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.pageLanguage.js',
                'dependencies' => [
diff --git a/resources/src/mediawiki.special/mediawiki.special.newFiles.js b/resources/src/mediawiki.special/mediawiki.special.newFiles.js
new file mode 100644 (file)
index 0000000..5e86eaa
--- /dev/null
@@ -0,0 +1,21 @@
+/*!
+ * JavaScript for Special:NewFiles
+ */
+( function ( mw, $ ) {
+       $( function () {
+               var start = mw.widgets.datetime.DateTimeInputWidget.static.infuse( 'mw-input-start' ),
+                       end = mw.widgets.datetime.DateTimeInputWidget.static.infuse( 'mw-input-end' ),
+                       temp;
+
+               // If the start date comes after the end date, swap the two values.
+               // This swap is already done internally when the form is submitted with a start date that
+               // comes after the end date, but this swap makes the change visible in the HTMLForm.
+               if ( start.getValue() !== '' &&
+                       end.getValue() !== '' &&
+                       start.getValue() > end.getValue() ) {
+                       temp = start.getValue();
+                       start.setValue( end.getValue() );
+                       end.setValue( temp );
+               }
+       } );
+}( mediaWiki, jQuery ) );