Adrian Lang has uploaded a new change for review. https://gerrit.wikimedia.org/r/239052
Change subject: Move sitelink scraping to sitelinkgrouplistview ...................................................................... Move sitelink scraping to sitelinkgrouplistview Change-Id: Ie18fb8e5e0d7ecca3ded216a4a2cd1aeb27393ef --- M view/resources/jquery/wikibase/jquery.wikibase.itemview.js M view/resources/jquery/wikibase/jquery.wikibase.sitelinkgrouplistview.js M view/resources/jquery/wikibase/resources.php M view/tests/qunit/jquery/wikibase/jquery.wikibase.sitelinkgrouplistview.tests.js 4 files changed, 101 insertions(+), 107 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/52/239052/1 diff --git a/view/resources/jquery/wikibase/jquery.wikibase.itemview.js b/view/resources/jquery/wikibase/jquery.wikibase.itemview.js index 2d86045..f9882e6 100644 --- a/view/resources/jquery/wikibase/jquery.wikibase.itemview.js +++ b/view/resources/jquery/wikibase/jquery.wikibase.itemview.js @@ -4,86 +4,6 @@ var PARENT = $.wikibase.entityview; /** - * Scrapes site links from static HTML in order to be sure the order in the static HTML matches the - * order set on the widget initialized on the HTML structure since that widget is not supposed to - * re-render the HTML for performance reasons. - * @ignore - * - * @param {jQuery} $siteLinks - * @param {wikibase.datamodel.SiteLinkSet} siteLinkSet - * @return {Object} - */ -function scrapeSiteLinks( $siteLinks, siteLinkSet ) { - var value = []; - - $siteLinks.find( '.wikibase-sitelinkgroupview' ).each( function() { - var $sitelinkgroupview = $( this ), - $sitelinklistview = $sitelinkgroupview.find( '.wikibase-sitelinklistview' ), - group = $sitelinkgroupview.data( 'wb-sitelinks-group' ), - siteIdsOfGroup = [], - siteLinkIds = siteLinkSet.getKeys(), - siteLinksOfGroup = []; - - $sitelinklistview.find( '.wikibase-sitelinkview' ).each( function() { - siteIdsOfGroup.push( $( this ).data( 'wb-siteid' ) ); - } ); - - for( var i = 0; i < siteIdsOfGroup.length; i++ ) { - for( var j = 0; j < siteLinkIds.length; j++ ) { - if( siteLinkIds[j] === siteIdsOfGroup[i] ) { - siteLinksOfGroup.push( siteLinkSet.getItemByKey( siteLinkIds[j] ) ); - break; - } - } - } - - value.push( { - group: group, - siteLinks: siteLinksOfGroup - } ); - } ); - - return value; -} - -/** - * Maps site links of a `wikibase.datamodel.SiteLinkSet` to their Wikibase site groups. - * @ignore - * - * @param {wikibase.datamodel.SiteLinkSet} siteLinkSet - * @return {Object} - */ -function orderSiteLinksByGroup( siteLinkSet ) { - var value = []; - - siteLinkSet.each( function( siteId, siteLink ) { - var site = wb.sites.getSite( siteId ), - found = false; - - if( !site ) { - throw new Error( 'Site with id ' + siteId + ' is not registered' ); - } - - for( var i = 0; i < value.length; i++ ) { - if( value[i].group === site.getGroup() ) { - value[i].siteLinks.push( siteLink ); - found = true; - break; - } - } - - if( !found ) { - value.push( { - group: site.getGroup(), - siteLinks: [siteLink] - } ); - } - } ); - - return value; -} - -/** * View for displaying a Wikibase `Item`. * @see wikibase.datamodel.Item * @class jQuery.wikibase.itemview @@ -183,16 +103,10 @@ * @protected */ _initSiteLinks: function() { - var self = this, - value = $( '.wikibase-sitelinkgrouplistview', this.element ).length - ? scrapeSiteLinks( this.$siteLinks, this.options.value.getSiteLinks() ) - : orderSiteLinksByGroup( this.options.value.getSiteLinks() ); - this.$siteLinks.sitelinkgrouplistview( { - value: value, - entityId: self.options.value.getId(), - siteLinksChanger: self.options.entityChangersFactory.getSiteLinksChanger(), - entityStore: self.options.entityStore + value: this.options.value, + siteLinksChanger: this.options.entityChangersFactory.getSiteLinksChanger(), + entityStore: this.options.entityStore } ); }, diff --git a/view/resources/jquery/wikibase/jquery.wikibase.sitelinkgrouplistview.js b/view/resources/jquery/wikibase/jquery.wikibase.sitelinkgrouplistview.js index 70fef4e..13eb5b3 100644 --- a/view/resources/jquery/wikibase/jquery.wikibase.sitelinkgrouplistview.js +++ b/view/resources/jquery/wikibase/jquery.wikibase.sitelinkgrouplistview.js @@ -5,16 +5,94 @@ ( function( $, mw ) { 'use strict'; - var PARENT = $.ui.TemplatedWidget; +/** + * Scrapes site links from static HTML in order to be sure the order in the static HTML matches the + * order set on the widget initialized on the HTML structure since that widget is not supposed to + * re-render the HTML for performance reasons. + * @ignore + * + * @param {jQuery} $siteLinks + * @param {wikibase.datamodel.SiteLinkSet} siteLinkSet + * @return {Object} + */ +function scrapeSiteLinks( $siteLinks, siteLinkSet ) { + var value = []; + + $siteLinks.find( '.wikibase-sitelinkgroupview' ).each( function() { + var $sitelinkgroupview = $( this ), + $sitelinklistview = $sitelinkgroupview.find( '.wikibase-sitelinklistview' ), + group = $sitelinkgroupview.data( 'wb-sitelinks-group' ), + siteIdsOfGroup = [], + siteLinkIds = siteLinkSet.getKeys(), + siteLinksOfGroup = []; + + $sitelinklistview.find( '.wikibase-sitelinkview' ).each( function() { + siteIdsOfGroup.push( $( this ).data( 'wb-siteid' ) ); + } ); + + for( var i = 0; i < siteIdsOfGroup.length; i++ ) { + for( var j = 0; j < siteLinkIds.length; j++ ) { + if( siteLinkIds[j] === siteIdsOfGroup[i] ) { + siteLinksOfGroup.push( siteLinkSet.getItemByKey( siteLinkIds[j] ) ); + break; + } + } + } + + value.push( { + group: group, + siteLinks: siteLinksOfGroup + } ); + } ); + + return value; +} + +/** + * Maps site links of a `wikibase.datamodel.SiteLinkSet` to their Wikibase site groups. + * @ignore + * + * @param {wikibase.datamodel.SiteLinkSet} siteLinkSet + * @return {Object} + */ +function orderSiteLinksByGroup( siteLinkSet ) { + var value = []; + + siteLinkSet.each( function( siteId, siteLink ) { + var site = wb.sites.getSite( siteId ), + found = false; + + if( !site ) { + throw new Error( 'Site with id ' + siteId + ' is not registered' ); + } + + for( var i = 0; i < value.length; i++ ) { + if( value[i].group === site.getGroup() ) { + value[i].siteLinks.push( siteLink ); + found = true; + break; + } + } + + if( !found ) { + value.push( { + group: site.getGroup(), + siteLinks: [siteLink] + } ); + } + } ); + + return value; +} + +var PARENT = $.ui.TemplatedWidget; /** * Encapsulates multiple sitelinkgroupview widgets. * @since 0.5 * @extends jQuery.ui.TemplatedWidget * - * @option {Object[]} value - * Array of objects representing the widget's value. - * Structure: [{ group: <{string}>, siteLinks: <{wikibase.datamodel.SiteLink[]}> }[, ...]] + * @option {wikibase.datamodel.Entity} value * * @option {wikibase.entityChangers.SiteLinksChanger} siteLinksChanger * @@ -79,6 +157,10 @@ var self = this, prefix = $.wikibase.sitelinkgroupview.prototype.widgetEventPrefix; + var value = this.element.is( ':empty' ) + ? scrapeSiteLinks( this.element, this.options.value.getSiteLinks() ) + : orderSiteLinksByGroup( this.options.value.getSiteLinks() ); + this.$listview = this.element.find( '.wikibase-listview' ); if( !this.$listview.length ) { @@ -99,7 +181,7 @@ }; } } ), - value: self.options.value || null, + value: value, encapsulate: true } ) .on( prefix + 'disable.' + this.widgetName, function( event ) { diff --git a/view/resources/jquery/wikibase/resources.php b/view/resources/jquery/wikibase/resources.php index 37293b5..bc651ae 100644 --- a/view/resources/jquery/wikibase/resources.php +++ b/view/resources/jquery/wikibase/resources.php @@ -249,7 +249,6 @@ 'jquery.wikibase.statementgrouplistview', 'jquery.wikibase.entityview', 'jquery.wikibase.sitelinkgrouplistview', - 'wikibase.sites', 'wikibase.utilities.ClaimGuidGenerator', ), ), @@ -335,6 +334,7 @@ 'jquery.util.EventSingletonManager', 'jquery.wikibase.listview', 'jquery.wikibase.sitelinkgroupview', + 'wikibase.sites', ), 'messages' => array( 'wikibase-sitelinkgroupview-input-help-message', diff --git a/view/tests/qunit/jquery/wikibase/jquery.wikibase.sitelinkgrouplistview.tests.js b/view/tests/qunit/jquery/wikibase/jquery.wikibase.sitelinkgrouplistview.tests.js index 2068fa5..1361b4d 100644 --- a/view/tests/qunit/jquery/wikibase/jquery.wikibase.sitelinkgrouplistview.tests.js +++ b/view/tests/qunit/jquery/wikibase/jquery.wikibase.sitelinkgrouplistview.tests.js @@ -68,18 +68,16 @@ } ) ); QUnit.test( 'Create & destroy', function( assert ) { - var value = [ - { - group: 'group1', - siteLinks: [new wb.datamodel.SiteLink( 'enwiki', 'page1' )] - }, { - group: 'group2', - siteLinks: [ - new wb.datamodel.SiteLink( 'dewiki', 'page1' ), - new wb.datamodel.SiteLink( 'enwiki', 'page2' ) - ] - } - ]; + var value = new wb.datamodel.Item( + 'Q1', + null, + null, + new wb.datamodel.SiteLinkSet( [ + new wb.datamodel.SiteLink( 'aawiki', 'page1' ), + new wb.datamodel.SiteLink( 'dewiki', 'page1' ), + new wb.datamodel.SiteLink( 'enwiki', 'page2' ) + ] ) + ); var $sitelinkgrouplistview = createSitelinkgrouplistview( { value: value -- To view, visit https://gerrit.wikimedia.org/r/239052 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie18fb8e5e0d7ecca3ded216a4a2cd1aeb27393ef Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Adrian Lang <adrian.he...@wikimedia.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits