@@ -130,44 +130,79 @@ private function populateQualifierSnakHtml( Statement $statement, array $stateme
130
130
}
131
131
132
132
/**
133
- * @param string $propertyId
134
- * @param Statement[] $statements
133
+ * @param StatementList[] $statementsLists
135
134
* @param App $app
136
135
* @param array &$snakHtmlLookup
137
136
* @return string HTML
138
137
*/
139
- private function getVueStatementHtml ( string $ propertyId , array $ statements , App $ app , array &$ snakHtmlLookup ): string {
140
- $ statementsData = [];
141
- foreach ( $ statements as $ statement ) {
142
- $ mainSnak = $ statement ->getMainSnak ();
143
- $ statementSerializer = $ this ->serializerFactory ->newStatementSerializer ();
144
- $ statementData = $ statementSerializer ->serialize ( $ statement );
145
-
146
- $ dataType = $ this ->propertyDataTypeLookup ->getDataTypeIdForProperty ( $ mainSnak ->getPropertyId () );
147
- $ statementData ['mainsnak ' ]['datatype ' ] = $ dataType ;
148
- $ this ->populateReferenceSnakHtml ( $ statement , $ statementData , $ snakHtmlLookup );
149
- $ this ->populateQualifierSnakHtml ( $ statement , $ statementData , $ snakHtmlLookup );
150
- if ( array_key_exists ( 'hash ' , $ statementData ['mainsnak ' ] ) ) {
151
- $ snakHtmlLookup [$ statementData ['mainsnak ' ]['hash ' ]] = $ this ->snakFormatter ->formatSnak ( $ mainSnak );
138
+ private function getVueStatementHtml ( array $ statementsLists , App $ app , array &$ snakHtmlLookup ): string {
139
+ $ rendered = '' ;
140
+ foreach ( $ statementsLists as $ key => $ statementsList ) {
141
+ if ( !is_string ( $ key ) || !( $ statementsList instanceof StatementList ) ) {
142
+ throw new InvalidArgumentException (
143
+ '$statementLists must be an associative array of StatementList objects '
144
+ );
152
145
}
153
- $ statementsData [] = $ statementData ;
154
- }
155
146
156
- return $ app ->renderComponent ( 'wbui2025-statement ' , [
157
- 'statements ' => $ statementsData ,
158
- 'propertyId ' => $ propertyId ,
159
- ] );
147
+ if ( $ key !== 'statements ' && $ statementsList ->isEmpty () ) {
148
+ continue ;
149
+ }
150
+
151
+ $ sectionHeadingHtml = $ this ->getHtmlForSectionHeading ( $ key );
152
+ $ propertyStatementMap = [];
153
+ $ propertyList = [];
154
+ foreach ( $ statementsList ->getPropertyIds () as $ propertyId ) {
155
+ $ propertyStatements = $ statementsList ->getByPropertyId ( $ propertyId )->toArray ();
156
+ $ propertyList [] = $ propertyId ->getSerialization ();
157
+
158
+ $ statementsData = [];
159
+ foreach ( $ propertyStatements as $ statement ) {
160
+ $ mainSnak = $ statement ->getMainSnak ();
161
+ $ statementSerializer = $ this ->serializerFactory ->newStatementSerializer ();
162
+ $ statementData = $ statementSerializer ->serialize ( $ statement );
163
+
164
+ $ dataType = $ this ->propertyDataTypeLookup ->getDataTypeIdForProperty ( $ mainSnak ->getPropertyId () );
165
+ $ statementData ['mainsnak ' ]['datatype ' ] = $ dataType ;
166
+ $ this ->populateReferenceSnakHtml ( $ statement , $ statementData , $ snakHtmlLookup );
167
+ $ this ->populateQualifierSnakHtml ( $ statement , $ statementData , $ snakHtmlLookup );
168
+ if ( array_key_exists ( 'hash ' , $ statementData ['mainsnak ' ] ) ) {
169
+ $ snakHtmlLookup [$ statementData ['mainsnak ' ]['hash ' ]] = $ this ->snakFormatter ->formatSnak ( $ mainSnak );
170
+ }
171
+ $ statementsData [] = $ statementData ;
172
+ }
173
+ $ propertyStatementMap [$ propertyId ->getSerialization ()] = $ statementsData ;
174
+ }
175
+
176
+ $ rendered .= $ app ->renderComponent ( 'wbui2025-statement-sections ' , [
177
+ 'sectionHeadingHtml ' => $ sectionHeadingHtml ,
178
+ 'propertyList ' => $ propertyList ,
179
+ 'propertyStatementMap ' => $ propertyStatementMap ,
180
+ ] );
181
+ }
182
+ return $ rendered ;
160
183
}
161
184
162
- /** @return string HTML */
163
- private function getVueStatementsHtml ( StatementList $ statementsList ): string {
185
+ /**
186
+ * @param StatementList[] $statementsLists
187
+ * @return string HTML
188
+ */
189
+ private function getVueStatementsHtml ( array $ statementsLists ): string {
164
190
$ snakHtmlLookup = [];
165
- $ app = new App ( [ 'snakHtml ' => function ( $ snak ) use ( &$ snakHtmlLookup ) {
166
- if ( array_key_exists ( $ snak ['hash ' ], $ snakHtmlLookup ) ) {
167
- return $ snakHtmlLookup [$ snak ['hash ' ]];
168
- }
169
- return '<p>No server-side HTML stored for snak ' . $ snak ['hash ' ] . '</p> ' ;
170
- } ] );
191
+ $ app = new App ( [
192
+ 'snakHtml ' => function ( $ snak ) use ( &$ snakHtmlLookup ) {
193
+ if ( array_key_exists ( $ snak ['hash ' ], $ snakHtmlLookup ) ) {
194
+ return $ snakHtmlLookup [$ snak ['hash ' ]];
195
+ }
196
+ return '<p>No server-side HTML stored for snak ' . $ snak ['hash ' ] . '</p> ' ;
197
+ },
198
+ 'concat ' => function ( ...$ args ) {
199
+ return implode ( '' , $ args );
200
+ },
201
+ ] );
202
+ $ app ->registerComponentTemplate (
203
+ 'wbui2025-statement-sections ' ,
204
+ file_get_contents ( __DIR__ . '/../../repo/resources/wikibase.wbui2025/wikibase.wbui2025.statementSections.vue ' ),
205
+ );
171
206
$ app ->registerComponentTemplate (
172
207
'wbui2025-statement ' ,
173
208
file_get_contents ( __DIR__ . '/../../repo/resources/wikibase.wbui2025/wikibase.wbui2025.statementView.vue ' ),
@@ -240,15 +275,9 @@ function ( array $data ): array {
240
275
}
241
276
);
242
277
243
- $ rendered = '' ;
244
- // Renders a placeholder statement element for each property, creating a mounting point for the client-side version
245
- foreach ( $ statementsList ->getPropertyIds () as $ propertyId ) {
246
- $ statements = $ statementsList ->getByPropertyId ( $ propertyId )->toArray ();
247
- $ renderedStatement = $ this ->getVueStatementHtml ( $ propertyId , $ statements , $ app , $ snakHtmlLookup );
248
- $ rendered .= "<div id='wikibase-wbui2025-statementwrapper- $ propertyId'> $ renderedStatement</div> " ;
249
- }
250
-
251
- return "<div id='wikibase-wbui2025-statementgrouplistview'> $ rendered</div> " ;
278
+ return "<div id='wikibase-wbui2025-statementgrouplistview'> " .
279
+ $ this ->getVueStatementHtml ( $ statementsLists , $ app , $ snakHtmlLookup ) .
280
+ "</div> " ;
252
281
}
253
282
254
283
/**
@@ -259,10 +288,10 @@ function ( array $data ): array {
259
288
* @return string HTML
260
289
*/
261
290
public function getHtml ( StatementList $ statementList , bool $ wbui2025Ready = false ) {
291
+ $ statementLists = $ this ->statementGrouper ->groupStatements ( $ statementList );
262
292
if ( $ wbui2025Ready && $ this ->vueStatementsView ) {
263
- return $ this ->getVueStatementsHtml ( $ statementList );
293
+ return $ this ->getVueStatementsHtml ( $ statementLists );
264
294
}
265
- $ statementLists = $ this ->statementGrouper ->groupStatements ( $ statementList );
266
295
$ html = '' ;
267
296
268
297
foreach ( $ statementLists as $ key => $ statements ) {
0 commit comments