From 3a7ce3d629ff529d681c09510480cd624f47ad1e Mon Sep 17 00:00:00 2001 From: Geoffrey Mon Date: Mon, 12 Dec 2016 12:01:02 -0500 Subject: [PATCH] Date range filtering in Special:NewFiles Bug: T13836 Change-Id: I6149a081db2494a36a715259b76a0c0470149b8c --- includes/specials/SpecialNewimages.php | 28 +++++++++++++++++++ includes/specials/pagers/NewFilesPager.php | 15 ++++++++-- resources/Resources.php | 6 ++++ .../mediawiki.special.newFiles.js | 21 ++++++++++++++ 4 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 resources/src/mediawiki.special/mediawiki.special.newFiles.js diff --git a/includes/specials/SpecialNewimages.php b/includes/specials/SpecialNewimages.php index 12dae8b8db..583d4f9e7c 100644 --- a/includes/specials/SpecialNewimages.php +++ b/includes/specials/SpecialNewimages.php @@ -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' ) ) { diff --git a/includes/specials/pagers/NewFilesPager.php b/includes/specials/pagers/NewFilesPager.php index e2d9d4201e..cce0323198 100644 --- a/includes/specials/pagers/NewFilesPager.php +++ b/includes/specials/pagers/NewFilesPager.php @@ -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() { diff --git a/resources/Resources.php b/resources/Resources.php index e8c8f61a9c..8071bd9663 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -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 index 0000000000..5e86eaaf24 --- /dev/null +++ b/resources/src/mediawiki.special/mediawiki.special.newFiles.js @@ -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 ) ); -- 2.20.1