@@ -130,44 +130,79 @@ private function populateQualifierSnakHtml( Statement $statement, array $stateme
130130 }
131131
132132 /**
133- * @param string $propertyId
134- * @param Statement[] $statements
133+ * @param StatementList[] $statementsLists
135134 * @param App $app
136135 * @param array &$snakHtmlLookup
137136 * @return string HTML
138137 */
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+ );
152145 }
153- $ statementsData [] = $ statementData ;
154- }
155146
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 ;
160183 }
161184
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 {
164190 $ 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+ );
171206 $ app ->registerComponentTemplate (
172207 'wbui2025-statement ' ,
173208 file_get_contents ( __DIR__ . '/../../repo/resources/wikibase.wbui2025/wikibase.wbui2025.statementView.vue ' ),
@@ -240,15 +275,9 @@ function ( array $data ): array {
240275 }
241276 );
242277
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> " ;
252281 }
253282
254283 /**
@@ -259,10 +288,10 @@ function ( array $data ): array {
259288 * @return string HTML
260289 */
261290 public function getHtml ( StatementList $ statementList , bool $ wbui2025Ready = false ) {
291+ $ statementLists = $ this ->statementGrouper ->groupStatements ( $ statementList );
262292 if ( $ wbui2025Ready && $ this ->vueStatementsView ) {
263- return $ this ->getVueStatementsHtml ( $ statementList );
293+ return $ this ->getVueStatementsHtml ( $ statementLists );
264294 }
265- $ statementLists = $ this ->statementGrouper ->groupStatements ( $ statementList );
266295 $ html = '' ;
267296
268297 foreach ( $ statementLists as $ key => $ statements ) {
0 commit comments