Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 98
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
EmailParticipantsModule
0.00% covered (danger)
0.00%
0 / 98
0.00% covered (danger)
0.00%
0 / 3
12
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 createContent
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
2
 getEmailForm
0.00% covered (danger)
0.00%
0 / 80
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3declare( strict_types=1 );
4
5namespace MediaWiki\Extension\CampaignEvents\FrontendModules;
6
7use Language;
8use OOUI\ButtonWidget;
9use OOUI\FieldLayout;
10use OOUI\FieldsetLayout;
11use OOUI\MessageWidget;
12use OOUI\MultilineTextInputWidget;
13use OOUI\PanelLayout;
14use OOUI\Tag;
15use OOUI\TextInputWidget;
16use OOUI\Widget;
17use Wikimedia\Message\IMessageFormatterFactory;
18use Wikimedia\Message\ITextFormatter;
19use Wikimedia\Message\MessageValue;
20
21class EmailParticipantsModule {
22
23    private IMessageFormatterFactory $messageFormatterFactory;
24
25    /**
26     * @param IMessageFormatterFactory $messageFormatterFactory
27     */
28    public function __construct(
29        IMessageFormatterFactory $messageFormatterFactory
30    ) {
31        $this->messageFormatterFactory = $messageFormatterFactory;
32    }
33
34    /**
35     * @param Language $language
36     * @return Tag
37     *
38     * @note Ideally, this wouldn't use MW-specific classes for l10n, but it's hard-ish to avoid and
39     * probably not worth doing.
40     */
41    public function createContent(
42        Language $language
43    ): Tag {
44        $msgFormatter = $this->messageFormatterFactory->getTextFormatter( $language->getCode() );
45        $items = [];
46
47        $items[] = ( new Tag( 'h2' ) )->appendContent(
48            $msgFormatter->format(
49                MessageValue::new( 'campaignevents-email-participants-label' )
50            )
51        );
52        $items[] = $this->getEmailForm( $msgFormatter );
53
54        $layout = new PanelLayout( [
55            'content' => $items,
56            'padded' => false,
57            'framed' => false,
58            'expanded' => false,
59        ] );
60
61        return ( new Tag( 'div' ) )
62            ->addClasses( [ 'ext-campaignevents-event-details-email-panel' ] )
63            ->appendContent( $layout );
64    }
65
66    /**
67     * @param ITextFormatter $msgFormatter
68     * @return FieldsetLayout
69     */
70    private function getEmailForm( ITextFormatter $msgFormatter ): FieldsetLayout {
71        $fields = [];
72
73        $recipientsList = ( new Tag( 'div' ) )->addClasses( [ 'ext-campaignevents-details-email-recipient-list' ] );
74        $addRecipientsBtn = new ButtonWidget( [
75            'framed' => false,
76            'flags' => [ 'progressive' ],
77            'label' => $msgFormatter->format(
78                MessageValue::new( 'campaignevents-event-details-email-recipients-link-text' )
79            ),
80            'infusable' => true,
81            'classes' => [ 'ext-campaignevents-details-email-recipients-link' ]
82        ] );
83
84        $fields[] = new FieldLayout(
85            new Widget( [
86                'content' => [ $recipientsList, $addRecipientsBtn ]
87            ] ),
88            [
89                'label' => $msgFormatter->format(
90                    MessageValue::new( 'campaignevents-event-details-email-recipients-label' )
91                ),
92                'align' => 'top',
93            ]
94        );
95
96        $fields[] = new FieldLayout(
97            new MessageWidget( [
98                'type' => 'warning',
99                'inline' => true,
100            ] ),
101            [
102                'infusable' => true,
103                'classes' => [ 'ext-campaignevents-details-email-notification', 'oo-ui-element-hidden' ]
104            ]
105        );
106
107        $fields[] = new FieldLayout(
108            new TextInputWidget( [
109                'placeholder' => $msgFormatter->format(
110                    MessageValue::new( 'campaignevents-event-details-email-subject-placeholder' )
111                ),
112                'infusable' => true,
113                'classes' => [ 'ext-campaignevents-details-email-subject' ]
114            ] ),
115            [
116                'label' => $msgFormatter->format(
117                    MessageValue::new( 'campaignevents-event-details-email-subject-label' )
118                ),
119                'align' => 'top',
120            ]
121        );
122
123        $fields[] = new FieldLayout(
124            new MultiLineTextInputWidget( [
125                'placeholder' => $msgFormatter->format(
126                    MessageValue::new( 'campaignevents-event-details-email-message-placeholder' )
127                ),
128                'infusable' => true,
129                'classes' => [ 'ext-campaignevents-details-email-message' ],
130                'minLength' => 10,
131                'maxLength' => 2000,
132                'rows' => 17,
133            ] ),
134            [
135                'label' => $msgFormatter->format(
136                    MessageValue::new( 'campaignevents-event-details-email-message-label' )
137                ),
138                'align' => 'top',
139            ]
140        );
141
142        $fields[] = new FieldLayout(
143            new ButtonWidget( [
144                'label' => $msgFormatter->format(
145                    MessageValue::new( 'campaignevents-event-details-email-recipients-button-text' )
146                ),
147                'classes' => [ 'ext-campaignevents-details-email-button' ],
148                'infusable' => true,
149                'flags' => [ 'primary', 'progressive' ],
150                'disabled' => true,
151            ] )
152        );
153
154        return new FieldsetLayout( [
155            'items' => $fields,
156            'classes' => [ 'ext-campaignevents-details-email-form' ]
157        ] );
158    }
159
160}