Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
ArchivedPager
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 4
306
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
 getQueryInfo
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
2
 getStatus
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getLinks
0.00% covered (danger)
0.00%
0 / 30
0.00% covered (danger)
0.00%
0 / 1
210
1<?php
2
3namespace MediaWiki\Extension\SecurePoll\Pages;
4
5use MediaWiki\Html\Html;
6use MediaWiki\Linker\LinkRenderer;
7use MediaWiki\Pager\IndexPager;
8use Wikimedia\Rdbms\ILoadBalancer;
9
10/**
11 * Pager for an archived election list. See TablePager documentation.
12 */
13class ArchivedPager extends ElectionPager {
14    private array $subpages = [
15        'unarchive' => [
16            'public' => false,
17            'visible-after-start' => false,
18            'visible-after-close' => true,
19            'token' => true
20        ]
21    ];
22    private LinkRenderer $linkRenderer;
23    private ILoadBalancer $loadBalancer;
24
25    public function __construct(
26        ArchivedPage $specialPage,
27        LinkRenderer $linkRenderer,
28        ILoadBalancer $loadBalancer
29    ) {
30        $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
31        parent::__construct();
32        $this->page = $specialPage;
33        $this->linkRenderer = $linkRenderer;
34        $this->loadBalancer = $loadBalancer;
35    }
36
37    /**
38     * Return query paramters in array form to get archived elections
39     */
40    public function getQueryInfo(): array {
41        $subquery = $this->loadBalancer->getConnection( ILoadBalancer::DB_REPLICA )->newSelectQueryBuilder()
42            ->select( 'pr_entity' )
43            ->from( 'securepoll_properties' )
44            ->where( [ 'pr_key' => 'is-archived' ] )
45            ->caller( __METHOD__ );
46
47        return [
48            'tables' => 'securepoll_elections',
49            'fields' => '*',
50            'conds' => [
51                'el_entity IN (' . $subquery->getSQL() . ')',
52            ],
53        ];
54    }
55
56    /**
57     * @return string HTML
58     */
59    public function getStatus(): string {
60        return $this->msg( 'securepoll-status-archived' )->escaped();
61    }
62
63    /**
64     * @return string HTML
65     */
66    public function getLinks(): string {
67        $pollId = $this->mCurrentRow->el_entity;
68        $html = '';
69        $separator = $this->msg( 'pipe-separator' )->escaped();
70        foreach ( $this->subpages as $subpage => $props ) {
71            // Message keys used here:
72            // securepoll-subpage-unarchive
73            $linkText = $this->msg( "securepoll-subpage-$subpage" )->text();
74
75            if ( $html !== '' ) {
76                $html .= $separator;
77            }
78
79            $needsHyperlink =
80                ( $this->isAdmin || $props['public'] ) &&
81                (
82                    !$this->election->isStarted() ||
83                    ( $this->election->isStarted() && $this->election->isFinished() ) ||
84                    $props['visible-after-start']
85                ) &&
86                ( !$this->election->isFinished() || $props['visible-after-close'] );
87            if ( $needsHyperlink ) {
88                $queryParams = [];
89                if ( isset( $props['token'] ) && $props['token'] ) {
90                    $queryParams[ 'token' ] = $this->page->specialPage->getContext()
91                        ->getCsrfTokenSet()->getToken();
92                }
93                if ( isset( $props['link'] ) ) {
94                    $html .= $this->{$props['link']}( $pollId );
95                } else {
96                    $title = $this->page->specialPage->getPageTitle( "$subpage/$pollId" );
97                    $html .= $this->linkRenderer->makeKnownLink( $title, $linkText, [], $queryParams );
98                }
99            } else {
100                $html .= Html::element(
101                    'span',
102                    [ 'class' => 'securepoll-link-disabled' ],
103                    $linkText
104                );
105            }
106        }
107
108        return $html;
109    }
110}