Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 13
CRAP
0.00% covered (danger)
0.00%
0 / 1
UploadStashPager
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 13
506
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 getFieldNames
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
6
 isFieldSortable
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getQueryInfo
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
2
 getIndexField
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getDefaultSort
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 formatValue
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 1
72
 getCurrentFile
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 getEscapedLimitSelectList
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 getForm
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
2
 getTableClass
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getNavClass
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getSortHeaderClass
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
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.
7 *
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.
12 *
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
17 *
18 * @file
19 * @ingroup Pager
20 */
21
22namespace MediaWiki\Pager;
23
24use File;
25use HTMLForm;
26use LocalRepo;
27use MediaWiki\Context\IContextSource;
28use MediaWiki\Html\Html;
29use MediaWiki\Linker\LinkRenderer;
30use MediaWiki\SpecialPage\SpecialPage;
31use UnexpectedValueException;
32use UploadStash;
33use UploadStashFile;
34use Wikimedia\Rdbms\IConnectionProvider;
35
36/**
37 * @ingroup Pager
38 */
39class UploadStashPager extends TablePager {
40    private UploadStash $stash;
41    private LocalRepo $localRepo;
42
43    /** @var string[]|null */
44    protected $mFieldNames = null;
45
46    /** @var File[] */
47    private array $files = [];
48
49    /**
50     * @param IContextSource $context
51     * @param LinkRenderer $linkRenderer
52     * @param IConnectionProvider $dbProvider
53     * @param UploadStash $stash
54     * @param LocalRepo $localRepo
55     */
56    public function __construct(
57        IContextSource $context,
58        LinkRenderer $linkRenderer,
59        IConnectionProvider $dbProvider,
60        UploadStash $stash,
61        LocalRepo $localRepo
62    ) {
63        $this->setContext( $context );
64
65        // Set database before parent constructor to avoid setting it there with wfGetDB
66        $this->mDb = $dbProvider->getReplicaDatabase();
67
68        parent::__construct( $context, $linkRenderer );
69
70        $this->stash = $stash;
71        $this->localRepo = $localRepo;
72    }
73
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(),
81            ];
82        }
83
84        return $this->mFieldNames;
85    }
86
87    protected function isFieldSortable( $field ) {
88        return in_array( $field, [ 'us_timestamp', 'us_key' ] );
89    }
90
91    public function getQueryInfo() {
92        return [
93            'tables' => [ 'uploadstash' ],
94            'fields' => [
95                'us_id',
96                'us_timestamp',
97                'us_key',
98                'us_size',
99                'us_path',
100            ],
101            'conds' => [ 'us_user' => $this->getUser()->getId() ],
102            'options' => [],
103            'join_conds' => [],
104        ];
105    }
106
107    public function getIndexField() {
108        return [ [ 'us_timestamp', 'us_id' ] ];
109    }
110
111    public function getDefaultSort() {
112        return 'us_timestamp';
113    }
114
115    /**
116     * @param string $field
117     * @param string|null $value
118     * @return string
119     */
120    public function formatValue( $field, $value ) {
121        $linkRenderer = $this->getLinkRenderer();
122
123        switch ( $field ) {
124            case 'us_timestamp':
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() ) );
127            case 'us_key':
128                return $this->getLinkRenderer()->makeKnownLink(
129                    SpecialPage::getTitleFor( 'UploadStash', "file/$value" ),
130                    $value
131                );
132            case 'thumb':
133                $file = $this->getCurrentFile();
134                if ( $file->allowInlineDisplay() ) {
135                    $thumbnail = $file->transform( [
136                        'width' => '120',
137                        'height' => '120',
138                    ] );
139                    if ( $thumbnail ) {
140                        return $thumbnail->toHtml( [ 'loading' => 'lazy' ] );
141                    }
142                }
143                return $this->msg( 'uploadstash-nothumb' )->escaped();
144            case 'us_size':
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()
150                    );
151            default:
152                throw new UnexpectedValueException( "Unknown field '$field'" );
153        }
154    }
155
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 );
160    }
161
162    /**
163     * Escape the options list
164     * @return array
165     */
166    private function getEscapedLimitSelectList(): array {
167        $list = $this->getLimitSelectList();
168        $result = [];
169        foreach ( $list as $key => $value ) {
170            $result[htmlspecialchars( $key )] = $value;
171        }
172        return $result;
173    }
174
175    public function getForm() {
176        $formDescriptor = [];
177        $formDescriptor['limit'] = [
178            'type' => 'radio',
179            'name' => 'limit',
180            'label-message' => 'table_pager_limit_label',
181            'options' => $this->getEscapedLimitSelectList(),
182            'flatlist' => true,
183            'default' => $this->mLimit
184        ];
185
186        HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
187            ->setMethod( 'get' )
188            ->setId( 'mw-uploadstash-form' )
189            ->setTitle( $this->getTitle() )
190            ->setSubmitTextMsg( 'uploadstash-pager-submit' )
191            ->setWrapperLegendMsg( 'uploadstash' )
192            ->prepareForm()
193            ->displayForm( '' );
194    }
195
196    protected function getTableClass() {
197        return parent::getTableClass() . ' uploadstash';
198    }
199
200    protected function getNavClass() {
201        return parent::getNavClass() . ' uploadstash_nav';
202    }
203
204    protected function getSortHeaderClass() {
205        return parent::getSortHeaderClass() . ' uploadstash_sort';
206    }
207}