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