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