Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 61
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
MainElectionsPager
0.00% covered (danger)
0.00%
0 / 61
0.00% covered (danger)
0.00%
0 / 4
380
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
 getLinks
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 1
272
 getLogLink
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace MediaWiki\Extension\SecurePoll\Pages;
4
5use MediaWiki\Html\Html;
6use MediaWiki\Linker\LinkRenderer;
7use MediaWiki\Pager\IndexPager;
8use MediaWiki\SpecialPage\SpecialPage;
9use Wikimedia\Rdbms\ILoadBalancer;
10
11/**
12 * Pager for an election list. See TablePager documentation.
13 */
14class MainElectionsPager extends ElectionPager {
15    private array $subpages = [
16        'vote' => [
17            'public' => true,
18            'visible-after-start' => true,
19            'visible-after-close' => false,
20        ],
21        'translate' => [
22            'public' => true,
23            'visible-after-start' => true,
24            'visible-after-close' => true,
25        ],
26        'list' => [
27            'public' => true,
28            'visible-after-start' => true,
29            'visible-after-close' => true,
30        ],
31        'edit' => [
32            'public' => false,
33            'visible-after-start' => true,
34            'visible-after-close' => false,
35        ],
36        'votereligibility' => [
37            'public' => false,
38            'visible-after-start' => true,
39            'visible-after-close' => true,
40        ],
41        'dump' => [
42            'public' => false,
43            'visible-after-start' => true,
44            'visible-after-close' => true,
45        ],
46        'dump-blt' => [
47            'public' => false,
48            'visible-after-start' => true,
49            'visible-after-close' => true,
50        ],
51        'tally' => [
52            'public' => false,
53            'visible-after-start' => true,
54            'visible-after-close' => true,
55        ],
56        'log' => [
57            'public' => false,
58            'visible-after-start' => true,
59            'visible-after-close' => true,
60            'link' => 'getLogLink'
61        ],
62        'archive' => [
63            'public' => false,
64            'visible-after-start' => false,
65            'visible-after-close' => true,
66        ]
67    ];
68    private LinkRenderer $linkRenderer;
69    private ILoadBalancer $loadBalancer;
70
71    public function __construct(
72        EntryPage $specialPage,
73        LinkRenderer $linkRenderer,
74        ILoadBalancer $loadBalancer
75    ) {
76        $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
77        parent::__construct();
78        $this->page = $specialPage;
79        $this->linkRenderer = $linkRenderer;
80        $this->loadBalancer = $loadBalancer;
81    }
82
83    /** @inheritDoc */
84    public function getQueryInfo() {
85        $subquery = $this->loadBalancer->getConnection( ILoadBalancer::DB_REPLICA )->newSelectQueryBuilder()
86            ->select( 'pr_entity' )
87            ->from( 'securepoll_properties' )
88            ->where( [ 'pr_key' => 'is-archived' ] )
89            ->caller( __METHOD__ );
90
91        return [
92            'tables' => 'securepoll_elections',
93            'fields' => '*',
94            'conds' => [
95                'el_entity NOT IN (' . $subquery->getSQL() . ')',
96            ],
97        ];
98    }
99
100    /**
101     * @return string HTML
102     */
103    public function getLinks(): string {
104        $pollId = (int)$this->mCurrentRow->el_entity;
105        $html = '';
106        $separator = $this->msg( 'pipe-separator' )->escaped();
107
108        // Only show "Logs" link if the page Special:SecurePollLog is enabled
109        if ( !$this->getConfig()->get( 'SecurePollUseLogging' ) ) {
110            unset( $this->subpages['log'] );
111        }
112
113        foreach ( $this->subpages as $subpage => $props ) {
114            // Message keys used here:
115            // securepoll-subpage-vote, securepoll-subpage-translate,
116            // securepoll-subpage-list, securepoll-subpage-dump, securepoll-subpage-dump-blt
117            // securepoll-subpage-tally, securepoll-subpage-votereligibility
118            // securepoll-subpage-log, securepoll-subpage-archive
119            $linkText = $this->msg( "securepoll-subpage-$subpage" )->text();
120            if ( $subpage === "dump" ) {
121                $linkText .= ' (XML)';
122            }
123            if ( $subpage === "dump-blt" ) {
124                $linkText = $this->msg( "securepoll-subpage-dump" )->text() . ' (BLT)';
125            }
126
127            if ( $html !== '' ) {
128                $html .= $separator;
129            }
130
131            $needsHyperlink =
132                ( $this->isAdmin || $props['public'] ) &&
133                (
134                    !$this->election->isStarted() ||
135                    ( $this->election->isStarted() && $this->election->isFinished() ) ||
136                    $props['visible-after-start']
137                ) &&
138                ( !$this->election->isFinished() || $props['visible-after-close'] );
139            if ( $needsHyperlink ) {
140                if ( isset( $props['link'] ) ) {
141                    $html .= $this->{$props['link']}( $pollId );
142                } else {
143                    if ( $subpage === "dump-blt" ) {
144                        $title = $this->page->specialPage->getPageTitle( "dump/$pollId" );
145                        $html .= $this->linkRenderer->makeKnownLink( $title, $linkText, [], [ 'format' => 'blt' ] );
146                    } else {
147                        $title = $this->page->specialPage->getPageTitle( "$subpage/$pollId" );
148                        $html .= $this->linkRenderer->makeKnownLink( $title, $linkText );
149                    }
150                }
151            } else {
152                $html .= Html::element(
153                    'span',
154                    [ 'class' => 'securepoll-link-disabled' ],
155                    $linkText
156                );
157            }
158        }
159
160        return $html;
161    }
162
163    /**
164     * Generate the link to the logs on SecurePollLog for an election
165     * @return string HTML
166     */
167    public function getLogLink( int $id ): string {
168        return $this->linkRenderer->makeLink(
169            SpecialPage::getTitleValueFor( 'SecurePollLog' ),
170            $this->msg( 'securepoll-subpage-log' )->text(),
171            [],
172            [
173                'type' => 'all',
174                'election_name' => $this->page->context->getElection( $id )->title,
175            ]
176        );
177    }
178}