Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 51
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
HTMLFormRadioRangeColumnLabels
0.00% covered (danger)
0.00%
0 / 51
0.00% covered (danger)
0.00%
0 / 3
506
0.00% covered (danger)
0.00%
0 / 1
 loadDataFromRequest
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
72
 validate
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
90
 getInputHTML
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2
3namespace MediaWiki\Extension\SecurePoll\HtmlForm;
4
5use MediaWiki\HTMLForm\HTMLFormField;
6use OOUI;
7
8/**
9 * A table for the RadioRangeBallot message inputs.
10 */
11class HTMLFormRadioRangeColumnLabels extends HTMLFormField {
12    /** @inheritDoc */
13    public function loadDataFromRequest( $request ) {
14        $values = $request->getArray( $this->mName );
15        if ( $values === null ) {
16            return $this->getDefault();
17        }
18
19        $neg = false;
20        foreach ( $values as $k => $v ) {
21            if ( preg_match( '/^-\d+$/', $k ) ) {
22                $neg = true;
23            }
24        }
25
26        $ret = [];
27        foreach ( $values as $k => $v ) {
28            if ( preg_match( '/^-?\d+$/', $k ) ) {
29                $key = ( $neg && $k > 0 ) ? "+$k" : $k;
30                $ret["column$key"] = $v;
31            }
32        }
33
34        return $ret;
35    }
36
37    /** @inheritDoc */
38    public function validate( $value, $alldata ) {
39        // Don't bother to validate the value of HTMLFormCloner template.
40        if ( strpos( $this->mName, 'HTMLFormFieldCloner' ) ) {
41            return true;
42        }
43
44        $p = parent::validate( $value, $alldata );
45        if ( $p !== true ) {
46            return $p;
47        }
48
49        $min = (string)$this->getNearestFieldValue( $alldata, 'min-score' );
50        $max = (string)$this->getNearestFieldValue( $alldata, 'max-score' );
51        if ( !preg_match( '/^-?\d+$/', $min ) || !preg_match( '/^-?\d+$/', $max ) ) {
52            return true;
53        }
54
55        for ( $i = $min; $i <= $max; $i++ ) {
56            $key = ( $min < 0 && $i > 0 ) ? "+$i" : $i;
57            if ( !isset( $value["column$key"] ) ) {
58                return $this->msg(
59                    'securepoll-htmlform-radiorange-missing-message',
60                    $key
61                )->parseAsBlock();
62            }
63        }
64
65        return true;
66    }
67
68    /** @inheritDoc */
69    public function getInputHTML( $value ) {
70        $inputs = [];
71
72        foreach ( (array)$value as $k => $v ) {
73            if ( !preg_match( '/^column([-+]?)(\d+)$/', $k, $m ) ) {
74                // Ignore "text"
75                continue;
76            }
77            $signedColNum = $m[1] . $m[2];
78            $intColNum = $m[1] === '-' ? $signedColNum : $m[2];
79
80            $inputs[] = ( new OOUI\FieldLayout(
81                new OOUI\TextInputWidget( [
82                    'value' => $v,
83                    'name' => "{$this->mName}[$intColNum]",
84                    'disabled' => isset( $this->mParams['disabled'] ) && $this->mParams['disabled'],
85                ] ),
86                [
87                    'label' => $signedColNum,
88                    'align' => 'top',
89                ]
90            ) )->setAttributes( [ 'data-securepoll-col-num' => $intColNum ] );
91        }
92
93        return ( new OOUI\Widget( [
94            'content' => new OOUI\HorizontalLayout( [ 'items' => $inputs ] ),
95            'classes' => [ 'securepoll-radiorange-messages' ],
96        ] ) )->setAttributes( [ 'data-securepoll-col-name' => $this->mName, ] );
97    }
98}