3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 * http://www.gnu.org/copyleft/gpl.html
22 namespace MediaWiki\Pager
;
26 use MediaWiki\Context\IContextSource
;
27 use MediaWiki\Html\Html
;
28 use MediaWiki\HTMLForm\HTMLForm
;
29 use MediaWiki\Linker\LinkRenderer
;
30 use MediaWiki\SpecialPage\SpecialPage
;
31 use UnexpectedValueException
;
34 use Wikimedia\Rdbms\IConnectionProvider
;
39 class UploadStashPager
extends TablePager
{
40 private UploadStash
$stash;
41 private LocalRepo
$localRepo;
43 /** @var string[]|null */
44 protected $mFieldNames = null;
47 private array $files = [];
50 * @param IContextSource $context
51 * @param LinkRenderer $linkRenderer
52 * @param IConnectionProvider $dbProvider
53 * @param UploadStash $stash
54 * @param LocalRepo $localRepo
56 public function __construct(
57 IContextSource
$context,
58 LinkRenderer
$linkRenderer,
59 IConnectionProvider
$dbProvider,
63 $this->setContext( $context );
65 // Set database before parent constructor to avoid setting it there with wfGetDB
66 $this->mDb
= $dbProvider->getReplicaDatabase();
68 parent
::__construct( $context, $linkRenderer );
70 $this->stash
= $stash;
71 $this->localRepo
= $localRepo;
74 protected function getFieldNames() {
75 if ( !$this->mFieldNames
) {
76 $this->mFieldNames
= [
77 'us_timestamp' => $this->msg( 'uploadstash-header-date' )->text(),
78 'us_key' => $this->msg( 'uploadstash-header-filekey' )->text(),
79 'thumb' => $this->msg( 'uploadstash-header-thumb' )->text(),
80 'us_size' => $this->msg( 'uploadstash-header-dimensions' )->text(),
84 return $this->mFieldNames
;
87 protected function isFieldSortable( $field ) {
88 return in_array( $field, [ 'us_timestamp', 'us_key' ] );
91 public function getQueryInfo() {
93 'tables' => [ 'uploadstash' ],
101 'conds' => [ 'us_user' => $this->getUser()->getId() ],
107 public function getIndexField() {
108 return [ [ 'us_timestamp', 'us_id' ] ];
111 public function getDefaultSort() {
112 return 'us_timestamp';
116 * @param string $field
117 * @param string|null $value
120 public function formatValue( $field, $value ) {
121 $linkRenderer = $this->getLinkRenderer();
125 // We may want to make this a link to the "old" version when displaying old files
126 return htmlspecialchars( $this->getLanguage()->userTimeAndDate( $value, $this->getUser() ) );
128 return $this->getLinkRenderer()->makeKnownLink(
129 SpecialPage
::getTitleFor( 'UploadStash', "file/$value" ),
133 $file = $this->getCurrentFile();
134 if ( $file->allowInlineDisplay() ) {
135 $thumbnail = $file->transform( [
140 return $thumbnail->toHtml( [ 'loading' => 'lazy' ] );
143 return $this->msg( 'uploadstash-nothumb' )->escaped();
145 $file = $this->getCurrentFile();
146 return htmlspecialchars( $file->getDimensionsString() )
147 . $this->msg( 'word-separator' )->escaped()
148 . Html
::element( 'span', [ 'style' => 'white-space: nowrap;' ],
149 $this->msg( 'parentheses' )->sizeParams( (int)$value )->text()
152 throw new UnexpectedValueException( "Unknown field '$field'" );
156 private function getCurrentFile(): File
{
157 $fileKey = $this->mCurrentRow
->us_key
;
158 return $this->files
[$fileKey]
159 ??
new UploadStashFile( $this->localRepo
, $this->mCurrentRow
->us_path
, $fileKey );
163 * Escape the options list
166 private function getEscapedLimitSelectList(): array {
167 $list = $this->getLimitSelectList();
169 foreach ( $list as $key => $value ) {
170 $result[htmlspecialchars( $key )] = $value;
175 public function getForm() {
176 $formDescriptor = [];
177 $formDescriptor['limit'] = [
180 'label-message' => 'table_pager_limit_label',
181 'options' => $this->getEscapedLimitSelectList(),
183 'default' => $this->mLimit
186 HTMLForm
::factory( 'ooui', $formDescriptor, $this->getContext() )
188 ->setId( 'mw-uploadstash-form' )
189 ->setTitle( $this->getTitle() )
190 ->setSubmitTextMsg( 'uploadstash-pager-submit' )
191 ->setWrapperLegendMsg( 'uploadstash' )
196 protected function getTableClass() {
197 return parent
::getTableClass() . ' uploadstash';
200 protected function getNavClass() {
201 return parent
::getNavClass() . ' uploadstash_nav';
204 protected function getSortHeaderClass() {
205 return parent
::getSortHeaderClass() . ' uploadstash_sort';