Adrian Lang has uploaded a new change for review. https://gerrit.wikimedia.org/r/242823
Change subject: Use ViewFactory for building statementgroupviews in statementgrouplistview ...................................................................... Use ViewFactory for building statementgroupviews in statementgrouplistview This change introduces a `ViewFactory` method for building `ListItemAdapter`s for `statementgroupviews` widgets. This `ListItemAdapter` is passed to the `statementgrouplistview` so that it can create the widgets without having to pass them all their dependencies. This change leaves `listview` as an implementation detail of `statementgrouplistview`. This implementation detail is publicly represented by having to pass in a `listview.ListItemAdapter`. It improves separation between the `statementgrouplistview` and `statementgroupview`, since the `statementgrouplistview` doesn't have to know how to construct a `statementgroupview` anymore. It also allows to inject a different implementation, for example in tests. This is a second step for T75380. Change-Id: I29f6e77c11bb205a435e46446d4ed52999a3e463 --- M view/resources/jquery/wikibase/jquery.wikibase.statementgrouplistview.js M view/resources/jquery/wikibase/resources.php M view/resources/wikibase/view/ViewFactory.js M view/resources/wikibase/view/resources.php M view/tests/qunit/jquery/wikibase/jquery.wikibase.statementgrouplistview.tests.js M view/tests/qunit/jquery/wikibase/resources.php M view/tests/qunit/wikibase/view/ViewFactory.tests.js 7 files changed, 111 insertions(+), 112 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/23/242823/1 diff --git a/view/resources/jquery/wikibase/jquery.wikibase.statementgrouplistview.js b/view/resources/jquery/wikibase/jquery.wikibase.statementgrouplistview.js index cc5478f..4814623 100644 --- a/view/resources/jquery/wikibase/jquery.wikibase.statementgrouplistview.js +++ b/view/resources/jquery/wikibase/jquery.wikibase.statementgrouplistview.js @@ -8,7 +8,6 @@ * `Property` id by managing a list of `jQuery.wikibase.statementgroupview` widgets. * @see wikibase.datamodel.StatementGroup * @see wikibase.datamodel.StatementGroupSet - * @uses jQuery.wikibase.statementgroupview * @uses jQuery.wikibase.statementgrouplabelscroll * @uses jQuery.wikibase.listview * @uses jQuery.wikibase.listview.ListItemAdapter @@ -20,25 +19,9 @@ * @constructor * * @param {Object} options + * @param {jquery.wikibase.listview.ListItemAdapter} options.listItemAdapter * @param {wikibase.datamodel.StatementGroupSet} options.value * The `Statements` to be displayed by this view. - * @param {wikibase.utilities.ClaimGuidGenerator} options.claimGuidGenerator - * Required for dynamically generating GUIDs for new `Statement`s. - * @param {wikibase.entityIdFormatter.EntityIdHtmlFormatter} options.entityIdHtmlFormatter - * Required for dynamically rendering links to `Entity`s. - * @param {wikibase.entityIdFormatter.EntityIdPlainFormatter} options.entityIdPlainFormatter - * Required for dynamically rendering plain text references to `Entity`s. - * @param {wikibase.store.EntityStore} options.entityStore - * Required for dynamically gathering `Entity`/`Property` information. - * @param {wikibase.ValueViewBuilder} options.valueViewBuilder - * Required by the `snakview` interfacing a `snakview` "value" `Variation` to - * `jQuery.valueview`. - * @param {wikibase.entityChangers.EntityChangersFactory} options.entityChangersFactory - * Required to store the `Reference`s gathered from the `referenceview`s aggregated by the - * `statementview`. - * @param {dataTypes.DataTypeStore} options.dataTypeStore - * Required by the `snakview` for retrieving and evaluating a proper `dataTypes.DataType` - * object when interacting on a "value" `Variation`. */ $.widget( 'wikibase.statementgrouplistview', PARENT, { /** @@ -51,14 +34,8 @@ '' // listview ], templateShortCuts: {}, - value: null, - claimGuidGenerator: null, - entityIdHtmlFormatter: null, - entityIdPlainFormatter: null, - entityStore: null, - valueViewBuilder: null, - entityChangersFactory: null, - dataTypeStore: null + listItemAdapter: null, + value: null }, /** @@ -75,11 +52,7 @@ */ _create: function() { if( - !this.options.claimGuidGenerator - || !this.options.entityStore - || !this.options.valueViewBuilder - || !this.options.entityChangersFactory - || !this.options.dataTypeStore + !this.options.listItemAdapter || !( this.options.value instanceof wb.datamodel.StatementGroupSet ) ) { throw new Error( 'Required option not specified properly' ); @@ -117,8 +90,6 @@ * @private */ _createListview: function() { - var self = this; - var $listview = this.element.children( '.wikibase-listview' ); if( !$listview.length ) { @@ -126,21 +97,7 @@ } $listview.listview( { - listItemAdapter: new $.wikibase.listview.ListItemAdapter( { - listItemWidget: $.wikibase.statementgroupview, - newItemOptionsFn: function( value ) { - return { - value: value, - claimGuidGenerator: self.options.claimGuidGenerator, - dataTypeStore: self.options.dataTypeStore, - entityIdHtmlFormatter: self.options.entityIdHtmlFormatter, - entityIdPlainFormatter: self.options.entityIdPlainFormatter, - entityStore: self.options.entityStore, - valueViewBuilder: self.options.valueViewBuilder, - entityChangersFactory: self.options.entityChangersFactory - }; - } - } ), + listItemAdapter: this.options.listItemAdapter, value: this._statementGroupSetToStatementGroups( this.options.value ) } ); diff --git a/view/resources/jquery/wikibase/resources.php b/view/resources/jquery/wikibase/resources.php index 21d2754..35c7f7d 100644 --- a/view/resources/jquery/wikibase/resources.php +++ b/view/resources/jquery/wikibase/resources.php @@ -68,9 +68,7 @@ 'jquery.ui.TemplatedWidget', 'jquery.ui.widget', 'jquery.wikibase.statementgrouplabelscroll', - 'jquery.wikibase.statementgroupview', 'jquery.wikibase.listview', - 'wikibase.datamodel.Item', 'wikibase.datamodel.StatementGroupSet', ), ), diff --git a/view/resources/wikibase/view/ViewFactory.js b/view/resources/wikibase/view/ViewFactory.js index 5abfcdb..aa80bf3 100644 --- a/view/resources/wikibase/view/ViewFactory.js +++ b/view/resources/wikibase/view/ViewFactory.js @@ -228,16 +228,33 @@ $dom, { value: entity.getStatements(), - claimGuidGenerator: new wb.utilities.ClaimGuidGenerator( entity.getId() ), - dataTypeStore: this._dataTypeStore, - entityStore: this._entityStore, - entityIdHtmlFormatter: this._entityIdHtmlFormatter, - entityIdPlainFormatter: this._entityIdPlainFormatter, - valueViewBuilder: this._getValueViewBuilder(), - entityChangersFactory: this._entityChangersFactory + listItemAdapter: this.getListItemAdapterForStatementGroupView( entity.getId() ) } ); + }; + /** + * Construct a `ListItemAdapter` for `statementgroupview`s + * + * @param {string} entityId + * @return {jQuery.wikibase.listview.ListItemAdapter} The constructed ListItemAdapter + **/ + SELF.prototype.getListItemAdapterForStatementGroupView = function( entityId ) { + return new $.wikibase.listview.ListItemAdapter( { + listItemWidget: $.wikibase.statementgroupview, + newItemOptionsFn: $.proxy( function( value ) { + return { + value: value, + claimGuidGenerator: new wb.utilities.ClaimGuidGenerator( entityId ), + dataTypeStore: this._dataTypeStore, + entityIdHtmlFormatter: this._entityIdHtmlFormatter, + entityIdPlainFormatter: this._entityIdPlainFormatter, + entityStore: this._entityStore, + valueViewBuilder: this._getValueViewBuilder(), + entityChangersFactory: this._entityChangersFactory + }; + }, this ) + } ); }; /** diff --git a/view/resources/wikibase/view/resources.php b/view/resources/wikibase/view/resources.php index 1c1b538..9132665 100644 --- a/view/resources/wikibase/view/resources.php +++ b/view/resources/wikibase/view/resources.php @@ -29,8 +29,10 @@ 'dependencies' => array( 'jquery.wikibase.entitytermsview', 'jquery.wikibase.itemview', + 'jquery.wikibase.listview', // For ListItemAdapter 'jquery.wikibase.propertyview', 'jquery.wikibase.statementgrouplistview', + 'jquery.wikibase.statementgroupview', 'wikibase.datamodel.MultiTerm', 'wikibase.datamodel.Term', 'wikibase.utilities.ClaimGuidGenerator', diff --git a/view/tests/qunit/jquery/wikibase/jquery.wikibase.statementgrouplistview.tests.js b/view/tests/qunit/jquery/wikibase/jquery.wikibase.statementgrouplistview.tests.js index 39f9584..812920d 100644 --- a/view/tests/qunit/jquery/wikibase/jquery.wikibase.statementgrouplistview.tests.js +++ b/view/tests/qunit/jquery/wikibase/jquery.wikibase.statementgrouplistview.tests.js @@ -6,6 +6,30 @@ ( function( $, wb, QUnit ) { 'use strict'; +function simpleWidget( name, fn ) { + var widget = function( options, element ) { + $.Widget.apply( this, arguments ); + this._createWidget( options, element ); + fn.apply( this ); + }; + + widget.prototype = new $.Widget(); + + widget.prototype.widgetFullName = name; + widget.prototype.widgetName = name; + widget.prototype.widgetEventPrefix = name; + widget.prototype.value = function() {}; + + return widget; +} + +var Statementgroupview = simpleWidget( + 'statementgroupview', + function() { + this.enterNewItem = function() {}; + } +); + /** * @param {Object} [options={}] * @param {jQuery} [$node] @@ -13,28 +37,10 @@ */ var createStatementgrouplistview = function( options, $node ) { options = $.extend( { - claimGuidGenerator: 'I am a ClaimGuidGenerator', - entityIdHtmlFormatter: { - format: function( entityId ) { - return $.Deferred().resolve( entityId ).promise(); - } - }, - entityIdPlainFormatter: { - format: function( entityId ) { - return $.Deferred().resolve( entityId ).promise(); - } - }, - entityStore: 'I am an EntityStore', - valueViewBuilder: 'I am a ValueViewBuilder', - entityChangersFactory: { - getClaimsChanger: function() { - return 'I am a ClaimsChanger'; - }, - getReferencesChanger: function() { - return 'I am a ReferencesChanger'; - } - }, - dataTypeStore: 'I am a DataTypeStore', + listItemAdapter: new $.wikibase.listview.ListItemAdapter( { + listItemWidget: Statementgroupview, + newItemOptionsFn: function() { return {}; } + } ), value: new wb.datamodel.StatementGroupSet() }, options || {} ); @@ -110,30 +116,22 @@ QUnit.test( 'enterNewItem & save', function( assert ) { var $statementgrouplistview = createStatementgrouplistview(), - statementgrouplistview = $statementgrouplistview.data( 'statementgrouplistview' ), - statementgrouplistviewListview = statementgrouplistview.listview, - statementgrouplistviewListviewLia = statementgrouplistviewListview.listItemAdapter(); + statementgrouplistview = $statementgrouplistview.data( 'statementgrouplistview' ); statementgrouplistview.enterNewItem(); - var $statementgroupview = statementgrouplistviewListview.items().first(), - statementgroupview = statementgrouplistviewListviewLia.liInstance( $statementgroupview ), - $statementlistview = statementgroupview.statementlistview.element; - - // Simulate having altered snakview's value: - $statementlistview.find( ':wikibase-snakview' ).data( 'snakview' ).snak = function() { - return new wb.datamodel.PropertyNoValueSnak( 'P1' ); - }; + var $statementgroupview = statementgrouplistview.listview.items().first(); assert.ok( $statementgroupview.hasClass( 'wb-new' ), 'Verified statementgroupview widget being pending.' ); - $statementlistview.data( 'statementlistview' )._trigger( 'afterstopediting', null, [false] ); + $statementgroupview.wrap( '<div/>' ); + $statementgroupview.trigger( 'afterstopediting', [false] ); assert.ok( - !statementgrouplistview.listview.items().eq( 0 ).hasClass( 'wb-new' ), + !statementgrouplistview.listview.items().first().hasClass( 'wb-new' ), 'Verified new statementgroupview not being pending after saving.' ); } ); diff --git a/view/tests/qunit/jquery/wikibase/resources.php b/view/tests/qunit/jquery/wikibase/resources.php index e56cce0..e48262e 100644 --- a/view/tests/qunit/jquery/wikibase/resources.php +++ b/view/tests/qunit/jquery/wikibase/resources.php @@ -51,14 +51,11 @@ 'jquery.wikibase.statementgrouplistview.tests.js', ), 'dependencies' => array( + 'jquery.wikibase.listview', // For ListItemAdapter 'jquery.wikibase.statementgrouplistview', - 'wikibase.datamodel.Claim', - 'wikibase.datamodel.PropertyNoValueSnak', - 'wikibase.datamodel.Statement', 'wikibase.datamodel.StatementGroup', 'wikibase.datamodel.StatementGroupSet', 'wikibase.datamodel.StatementList', - 'wikibase.store.EntityStore', ), ), diff --git a/view/tests/qunit/wikibase/view/ViewFactory.tests.js b/view/tests/qunit/wikibase/view/ViewFactory.tests.js index cc6f955..dcdfdfe 100644 --- a/view/tests/qunit/wikibase/view/ViewFactory.tests.js +++ b/view/tests/qunit/wikibase/view/ViewFactory.tests.js @@ -86,8 +86,25 @@ } ); QUnit.test( 'getStatementGroupListView passes correct options to views', function( assert ) { + var entity = new wb.datamodel.Item( 'Q1' ), + viewFactory = new ViewFactory(), + $dom = $( '<div/>' ); + + $dom.statementgrouplistview = sinon.stub( $.wikibase, 'statementgrouplistview' ); + + viewFactory.getStatementGroupListView( entity, $dom ); + + sinon.assert.calledWith( $.wikibase.statementgrouplistview, sinon.match( { + value: entity.getStatements(), + listItemAdapter: sinon.match.instanceOf( $.wikibase.listview.ListItemAdapter ) + } ) ); + + $.wikibase.statementgrouplistview.restore(); + } ); + + QUnit.test( 'getListItemAdapterForStatementGroupView passes correct options to ListItemAdapter', function( assert ) { var contentLanguages = {}, - entity = new wb.datamodel.Item( 'Q1' ), + entityId = 'Q1', dataTypeStore = {}, entityChangersFactory = {}, entityIdHtmlFormatter = {}, @@ -111,13 +128,22 @@ parserStore, userLanguages ), - $dom = $( '<div/>' ); + ListItemAdapter = sinon.spy( $.wikibase.listview, 'ListItemAdapter' ), + value = {}; - sinon.spy( $.wikibase, 'statementgrouplistview' ); - $dom.statementgrouplistview = $.wikibase.statementgrouplistview; sinon.spy( wb, 'ValueViewBuilder' ); - viewFactory.getStatementGroupListView( entity, $dom ); + viewFactory.getListItemAdapterForStatementGroupView( entityId ); + + sinon.assert.calledWith( + ListItemAdapter, + sinon.match( { + listItemWidget: $.wikibase.statementgroupview, + newItemOptionsFn: sinon.match.func + } ) + ); + + var result = ListItemAdapter.args[0][0].newItemOptionsFn( value ); sinon.assert.calledWith( wb.ValueViewBuilder, expertStore, @@ -128,19 +154,23 @@ contentLanguages ); - sinon.assert.calledWith( $.wikibase.statementgrouplistview, sinon.match( { - value: entity.getStatements(), - claimGuidGenerator: sinon.match.instanceOf( wb.utilities.ClaimGuidGenerator ), - dataTypeStore: dataTypeStore, - entityStore: entityStore, - entityIdHtmlFormatter: entityIdHtmlFormatter, - entityIdPlainFormatter: entityIdPlainFormatter, - valueViewBuilder: wb.ValueViewBuilder.returnValues[0], - entityChangersFactory: entityChangersFactory - } ) ); + assert.deepEqual( + result, + { + value: value, + claimGuidGenerator: result.claimGuidGenerator, // Hack for ignoring this field + dataTypeStore: dataTypeStore, + entityStore: entityStore, + entityIdHtmlFormatter: entityIdHtmlFormatter, + entityIdPlainFormatter: entityIdPlainFormatter, + valueViewBuilder: wb.ValueViewBuilder.returnValues[0], + entityChangersFactory: entityChangersFactory + } + ); + assert.ok( result.claimGuidGenerator instanceof wb.utilities.ClaimGuidGenerator ); wb.ValueViewBuilder.restore(); - $.wikibase.statementgrouplistview.restore(); + $.wikibase.listview.ListItemAdapter.restore(); } ); QUnit.test( 'getEntityTermsView passes correct options to views', function( assert ) { -- To view, visit https://gerrit.wikimedia.org/r/242823 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I29f6e77c11bb205a435e46446d4ed52999a3e463 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