Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 132
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
StoryEditPage
0.00% covered (danger)
0.00%
0 / 132
0.00% covered (danger)
0.00%
0 / 2
56
0.00% covered (danger)
0.00%
0 / 1
 showContentForm
0.00% covered (danger)
0.00%
0 / 99
0.00% covered (danger)
0.00%
0 / 1
12
 importContentFormData
0.00% covered (danger)
0.00%
0 / 33
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2
3namespace MediaWiki\Extension\Wikistories;
4
5use MediaWiki\EditPage\EditPage;
6use MediaWiki\Html\Html;
7use MediaWiki\MediaWikiServices;
8use MediaWiki\Request\WebRequest;
9use OOUI\FieldLayout;
10use OOUI\HiddenInputWidget;
11use OOUI\MultilineTextInputWidget;
12use OOUI\TextInputWidget;
13
14class StoryEditPage extends EditPage {
15
16    private ?StoryContent $wipStory = null;
17
18    protected function showContentForm(): void {
19        $maxFrames = $this->context->getConfig()->get( 'WikistoriesMaxFrames' );
20        $maxTextLength = $this->context->getConfig()->get( 'WikistoriesMaxTextLength' );
21        $out = $this->context->getOutput();
22        /** @var StoryConverter $storyConverter */
23        $storyConverter = MediaWikiServices::getInstance()
24            ->get( 'Wikistories.StoryConverter' );
25
26        if ( $this->wipStory === null ) {
27            /** @var StoryContent $originalStory */
28            $originalStory = $this->getContentObject();
29            '@phan-var StoryContent $originalStory';
30
31            $story = $storyConverter->toLatest( $originalStory );
32        } else {
33            $story = $this->wipStory;
34        }
35
36        $currentFrames = $story->getFrames();
37        $emptyFrame = (object)[
38            'image' => (object)[ 'filename' => '' ],
39            'text' => (object)[
40                'value' => '',
41                'fromArticle' => (object)[
42                    'articleTitle' => '',
43                    'originalText' => '',
44                ],
45            ],
46        ];
47
48        $form = '<div class="ext-wikistories-editform">';
49        $form .= new FieldLayout(
50            new TextInputWidget(
51                [
52                    'name' => "story_from_article",
53                    'value' => $story->getFromArticle(), 'disabled' => true
54                ]
55            ),
56            [
57                'label' => $this->context->msg( 'wikistories-nojs-form-label-related-article' )->text(),
58                'align' => 'left',
59            ]
60        );
61        $form .= new HiddenInputWidget(
62            [
63                'name' => "story_article_id",
64                'value' => $story->getArticleId(),
65            ]
66
67        );
68        for ( $i = 0; $i < $maxFrames; $i++ ) {
69            $frame = $currentFrames[ $i ] ?? $emptyFrame;
70            $form .= Html::element( 'h3', [],
71                $this->context->msg( 'wikistories-nojs-form-label-frame' )->params( $i + 1 )->text()
72            );
73            $form .= new FieldLayout(
74                new TextInputWidget(
75                    [ 'name' => "story_frame_{$i}_image_filename", 'value' => $frame->image->filename ]
76                ),
77                [
78                    'label' => $this->context->msg( 'wikistories-nojs-form-label-image' )->text(),
79                    'align' => 'left'
80                ]
81            );
82            $form .= new FieldLayout(
83                new TextInputWidget(
84                    [
85                        'name' => "story_frame_{$i}_text_value",
86                        'value' => $frame->text->value,
87                        'maxlength' => $maxTextLength,
88                    ]
89
90                ),
91                [
92                    'label' => $this->context->msg( 'wikistories-nojs-form-label-text' )->text(),
93                    'align' => 'left'
94                ]
95            );
96            $form .= new HiddenInputWidget(
97                [
98                    'name' => "story_frame_{$i}_text_fromArticle_articleTitle",
99                    'value' => $frame->text->fromArticle->articleTitle ?? '',
100                ]
101
102            );
103            $form .= new HiddenInputWidget(
104                [
105                    'name' => "story_frame_{$i}_text_fromArticle_originalText",
106                    'value' => $frame->text->fromArticle->originalText ?? '',
107                ]
108
109            );
110        }
111
112        // Categories
113        $form .= Html::element( 'h3', [],
114            $this->context->msg( 'wikistories-nojs-form-categories-title' )->text()
115        );
116        $categories = $story->getCategories();
117        $form .= new FieldLayout(
118            new MultilineTextInputWidget(
119                [
120                    'name' => "story_categories",
121                    'value' => implode( "\n", $categories ),
122                    'rows' => 5,
123                ]
124
125            ),
126            [
127                'label' => $this->context->msg( 'wikistories-nojs-form-categories-label' )->text(),
128                'align' => 'left',
129            ]
130        );
131
132        $form .= '</div>';
133        $out->enableOOUI();
134        $out->addHTML( $form );
135    }
136
137    /**
138     * @param WebRequest &$request
139     * @return false|string|null
140     */
141    protected function importContentFormData( &$request ) {
142        $story = [
143            'articleId' => intval( $request->getText( 'story_article_id' ) ),
144            'categories' => array_values(
145                array_unique( array_filter( array_map( 'trim',
146                    explode( "\n", trim( $request->getText( 'story_categories' ) ) )
147                ) ) )
148            ),
149            'frames' => []
150        ];
151
152        $i = 0;
153        while ( true ) {
154            $filename = $request->getText( "story_frame_{$i}_image_filename" );
155            $text = $request->getText( "story_frame_{$i}_text_value" );
156            $articleTitle = $request->getText( "story_frame_{$i}_text_fromArticle_articleTitle" );
157            $originalText = $request->getText( "story_frame_{$i}_text_fromArticle_originalText" );
158            if ( $filename === '' && $text === '' ) {
159                // stop reading as soon as all fields are empty
160                break;
161            }
162            $story['frames'][] = [
163                'image' => [
164                    'filename' => $filename,
165                ],
166                'text' => [
167                    'value' => $text,
168                    'fromArticle' => [
169                        'articleTitle' => $articleTitle,
170                        'originalText' => $originalText,
171                    ],
172                ],
173            ];
174            $i++;
175        }
176
177        $stringContent = json_encode( $story, JSON_PRETTY_PRINT );
178
179        $this->wipStory = new StoryContent( $stringContent );
180
181        return $stringContent;
182    }
183
184}