jenkins-bot has submitted this change and it was merged.
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(-)
Approvals:
Jonas Kress (WMDE): Looks good to me, approved
jenkins-bot: Verified
diff --git
a/view/resources/jquery/wikibase/jquery.wikibase.statementgrouplistview.js
b/view/resources/jquery/wikibase/jquery.wikibase.statementgrouplistview.js
index a3d8673..e7b46ab 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
},
/**
@@ -74,11 +51,7 @@
* @throws {Error} if a required option is not specified properly.
*/
_create: function() {
- if ( !this.options.claimGuidGenerator
- || !this.options.entityStore
- || !this.options.valueViewBuilder
- || !this.options.entityChangersFactory
- || !this.options.dataTypeStore
+ if ( !this.options.listItemAdapter
|| !( this.options.value instanceof
wb.datamodel.StatementGroupSet )
) {
throw new Error( 'Required option not specified
properly' );
@@ -116,8 +89,6 @@
* @private
*/
_createListview: function() {
- var self = this;
-
var $listview = this.element.children( '.wikibase-listview' );
if ( !$listview.length ) {
@@ -125,21 +96,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 a1b618d..1c97f5c 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 465726c..03441cd 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 7d9647e..3ab74c4 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: merged
Gerrit-Change-Id: I29f6e77c11bb205a435e46446d4ed52999a3e463
Gerrit-PatchSet: 3
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Adrian Lang <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits