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

Reply via email to