Adrian Lang has uploaded a new change for review.
https://gerrit.wikimedia.org/r/188357
Change subject: Introduce wikibase.view.ViewFactory
......................................................................
Introduce wikibase.view.ViewFactory
Bug: T87434
Change-Id: I0ff09c7621f478bf05a87a072954d405971750eb
---
M repo/resources/Resources.php
M repo/resources/wikibase.ui.entityViewInit.js
A view/resources/ViewFactory.js
M view/resources/resources.php
A view/tests/qunit/ViewFactory.tests.js
M view/tests/qunit/resources.php
6 files changed, 264 insertions(+), 29 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/57/188357/1
diff --git a/repo/resources/Resources.php b/repo/resources/Resources.php
index 068a24b..c76b1a8 100644
--- a/repo/resources/Resources.php
+++ b/repo/resources/Resources.php
@@ -148,8 +148,6 @@
'dependencies' => array(
'mediawiki.user',
'mw.config.values.wbRepo',
- 'jquery.wikibase.itemview',
- 'jquery.wikibase.propertyview',
'jquery.wikibase.toolbarcontroller',
'jquery.wikibase.toolbarcontroller.definitions.addtoolbar.statementgrouplistview-statementgroupview',
'jquery.wikibase.toolbarcontroller.definitions.addtoolbar.statementlistview-statementview',
@@ -183,7 +181,7 @@
'wikibase.store.CombiningEntityStore',
'wikibase.store.FetchedContentUnserializer',
'wikibase.store.MwConfigEntityStore',
- 'wikibase.ValueViewBuilder'
+ 'wikibase.view.ViewFactory'
),
'messages' => array(
'pagetitle',
diff --git a/repo/resources/wikibase.ui.entityViewInit.js
b/repo/resources/wikibase.ui.entityViewInit.js
index eec6125..263477d 100644
--- a/repo/resources/wikibase.ui.entityViewInit.js
+++ b/repo/resources/wikibase.ui.entityViewInit.js
@@ -103,12 +103,12 @@
/**
* Builds an entity store.
- * @todo Move to a top-level factory or application scope
*
* @param {wikibase.api.RepoApi} repoApi
+ * @param {string} language The language code of the ui language
* @return {wikibase.store.CombiningEntityStore}
*/
- function buildEntityStore( repoApi ) {
+ function buildEntityStore( repoApi, language ) {
// Deserializer for fetched content whose content is a
wb.datamodel.Entity:
var fetchedEntityDeserializer = new
wb.store.FetchedContentUnserializer(
new wb.serialization.EntityDeserializer()
@@ -119,10 +119,9 @@
new wb.store.ApiEntityStore(
repoApi,
fetchedEntityDeserializer,
- [ mw.config.get( 'wgUserLanguage' ) ]
+ [ language ]
)
] );
-
}
/**
@@ -136,40 +135,32 @@
var repoConfig = mw.config.get( 'wbRepo' );
var mwApi = wb.api.getLocationAgnosticMwApi( repoConfig.url +
repoConfig.scriptPath + '/api.php' );
var repoApi = new wb.api.RepoApi( mwApi ),
- entityStore = buildEntityStore( repoApi ),
+ userLanguages = getUserLanguages(),
+ entityStore = buildEntityStore( repoApi,
userLanguages[0] ),
revisionStore = new wb.RevisionStore( mw.config.get(
'wgCurRevisionId' ) ),
entityChangersFactory = new
wb.entityChangers.EntityChangersFactory(
repoApi,
revisionStore,
entity
- );
-
- var viewName = entity.getType() + 'view';
-
- if( !$.wikibase[ viewName ] ) {
- throw new Error( 'View for entity type ' +
entity.getType() + ' does not exist' );
- }
-
- $entityview[ viewName ]( {
- value: entity,
- languages: getUserLanguages(),
- entityChangersFactory: entityChangersFactory,
- entityStore: entityStore,
- valueViewBuilder: new wb.ValueViewBuilder(
+ ),
+ viewFactory = new wikibase.view.ViewFactory(
+ dataTypeStore,
+ entityChangersFactory,
+ entityStore,
getExpertsStore( dataTypeStore ),
getFormatterStore( repoApi, dataTypeStore ),
- getParserStore( repoApi ),
- mw.config.get( 'wgUserLanguage' ),
{
getMessage: function( key, params ) {
return mw.msg.apply( mw, [ key
].concat( params ) );
}
- }
- ),
- dataTypeStore: dataTypeStore
- } );
+ },
+ getParserStore( repoApi ),
+ userLanguages
+ );
- return viewName;
+ var entityView = viewFactory.getEntityView( entity, $entityview
);
+
+ return entityView.widgetName;
}
/**
diff --git a/view/resources/ViewFactory.js b/view/resources/ViewFactory.js
new file mode 100644
index 0000000..3b5f45a
--- /dev/null
+++ b/view/resources/ViewFactory.js
@@ -0,0 +1,132 @@
+( function( $, wb ) {
+ 'use strict';
+
+ var MODULE = wb.view;
+
+ /**
+ * A factory for creating view widgets
+ *
+ * @class wikibase.view.ViewFactory
+ * @license GNU GPL v2+
+ * @author Adrian Heine < [email protected] >
+ *
+ * @param {dataTypes.DataTypeStore} dataTypeStore
+ * @param {wikibase.entityChangers.EntityChangersFactory}
entityChangersFactory
+ * @param {wikibase.store.EntityStore} entityStore
+ * @param {jQuery.valueview.ExpertStore} expertStore
+ * @param {valueFormatters.ValueFormatterStore} formatterStore
+ * @param {util.MessageProvider} messageProvider
+ * @param {valueParsers.ValueParserStore} parserStore
+ * @param {string[]} userLanguages An array of language codes, the
first being the UI language
+ */
+ var SELF = MODULE.ViewFactory = function ViewFactory(
+ dataTypeStore,
+ entityChangersFactory,
+ entityStore,
+ expertStore,
+ formatterStore,
+ messageProvider,
+ parserStore,
+ userLanguages
+ ) {
+ this._dataTypeStore = dataTypeStore;
+ this._entityChangersFactory = entityChangersFactory;
+ this._entityStore = entityStore;
+ this._expertStore = expertStore;
+ this._formatterStore = formatterStore;
+ this._messageProvider = messageProvider;
+ this._parserStore = parserStore;
+ this._userLanguages = userLanguages;
+ };
+
+ /**
+ * @property {dataTypes.DataTypeStore}
+ * @private
+ **/
+ SELF.prototype._dataTypeStore = null;
+
+ /**
+ * @property {wikibase.entityChangers.EntityChangersFactory}
+ * @private
+ **/
+ SELF.prototype._entityChangersFactory = null;
+
+ /**
+ * @property {wikibase.store.EntityStore}
+ * @private
+ **/
+ SELF.prototype._entityStore = null;
+
+ /**
+ * @property {jQuery.valueview.ExpertStore}
+ * @private
+ **/
+ SELF.prototype._expertStore = null;
+
+ /**
+ * @property {valueFormatters.ValueFormatterStore}
+ * @private
+ **/
+ SELF.prototype._formatterStore = null;
+
+ /**
+ * @property {util.MessageProvider}
+ * @private
+ **/
+ SELF.prototype._messageProvider = null;
+
+ /**
+ * @property {valueParsers.ValueParserStore}
+ * @private
+ **/
+ SELF.prototype._parserStore = null;
+
+ /**
+ * @property {string[]}
+ * @private
+ **/
+ SELF.prototype._userLanguages = null;
+
+ /**
+ * Construct a suitable view for the given entity on the given DOM
element
+ *
+ * @param {wikibase.datamodel.Entity} entity
+ * @param {jQuery} $dom
+ * @return {Object} The constructed entity view
+ **/
+ SELF.prototype.getEntityView = function( entity, $dom ) {
+ return this._getView(
+ entity.getType() + 'view',
+ $dom,
+ {
+ dataTypeStore: this._dataTypeStore,
+ entityChangersFactory:
this._entityChangersFactory,
+ entityStore: this._entityStore,
+ languages: this._userLanguages,
+ value: entity,
+ valueViewBuilder: this._getValueViewBuilder()
+ }
+ );
+ };
+
+ SELF.prototype._getValueViewBuilder = function() {
+ return new wb.ValueViewBuilder(
+ this._expertStore,
+ this._formatterStore,
+ this._parserStore,
+ this._userLanguages && this._userLanguages[0],
+ this._messageProvider
+ );
+ };
+
+ SELF.prototype._getView = function( viewName, $dom, options ) {
+ if( !$.wikibase[ viewName ] ) {
+ throw new Error( 'View ' + viewName + ' does not exist'
);
+ }
+
+ $dom[ viewName ]( options );
+
+ return $dom.data( viewName );
+ };
+
+} ( jQuery, wikibase ) );
diff --git a/view/resources/resources.php b/view/resources/resources.php
index b47358d..edd593d 100644
--- a/view/resources/resources.php
+++ b/view/resources/resources.php
@@ -19,6 +19,17 @@
'namespace.js'
),
),
+ 'wikibase.view.ViewFactory' => $moduleTemplate + array(
+ 'scripts' => array(
+ 'ViewFactory.js'
+ ),
+ 'dependencies' => array(
+ 'jquery.wikibase.itemview',
+ 'jquery.wikibase.propertyview',
+ 'wikibase.view.__namespace',
+ 'wikibase.ValueViewBuilder'
+ )
+ ),
);
return $modules;
diff --git a/view/tests/qunit/ViewFactory.tests.js
b/view/tests/qunit/ViewFactory.tests.js
new file mode 100644
index 0000000..19fd779
--- /dev/null
+++ b/view/tests/qunit/ViewFactory.tests.js
@@ -0,0 +1,94 @@
+( function( $, wikibase, ViewFactory ) {
+ 'use strict';
+
+ QUnit.module( 'wikibase.view.ViewFactory', QUnit.newMwEnvironment() );
+
+ QUnit.test( 'is constructable', function( assert ) {
+ assert.ok( new ViewFactory() instanceof ViewFactory );
+ } );
+
+ function getEntityStub( type ) {
+ return {
+ getType: function() {
+ return type;
+ }
+ };
+ }
+
+ QUnit.test( 'getEntityView constructs correct views', function( assert
) {
+ var viewFactory = new ViewFactory(),
+ fooView = {},
+ $dom = {
+ data: function( type ) {
+ return fooView;
+ }
+ },
+ FooView = $dom.fooview = $.wikibase.fooview =
sinon.spy();
+
+ var res = viewFactory.getEntityView( getEntityStub( 'foo' ),
$dom );
+
+ assert.strictEqual( res, fooView );
+ sinon.assert.calledOnce( FooView );
+ } );
+
+ QUnit.test( 'getEntityView throws on incorrect views', function( assert
) {
+ var viewFactory = new ViewFactory();
+
+ assert.throws(
+ function() {
+ viewFactory.getEntityView( getEntityStub(
'unknown' ) );
+ },
+ new Error( 'View unknownview does not exist' )
+ );
+ } );
+
+ QUnit.test( 'getEntityView passes correct options to views', function(
assert ) {
+ var dataTypeStore = {},
+ entity = getEntityStub( 'foo' ),
+ entityChangersFactory = {},
+ entityStore = {},
+ expertStore = {},
+ formatterStore = {},
+ messageProvider = {},
+ parserStore = {},
+ userLanguages = [],
+ viewFactory = new ViewFactory(
+ dataTypeStore,
+ entityChangersFactory,
+ entityStore,
+ expertStore,
+ formatterStore,
+ messageProvider,
+ parserStore,
+ userLanguages
+ ),
+ $dom = {
+ data: function( type ) {}
+ },
+ FooView = $dom.fooview = $.wikibase.fooview =
sinon.spy();
+
+ sinon.spy( wb, 'ValueViewBuilder' );
+
+ viewFactory.getEntityView( entity, $dom );
+
+ sinon.assert.calledWith( wb.ValueViewBuilder,
+ expertStore,
+ formatterStore,
+ parserStore,
+ userLanguages[0],
+ messageProvider
+ );
+
+ sinon.assert.calledWith( FooView, {
+ dataTypeStore: dataTypeStore,
+ entityChangersFactory: entityChangersFactory,
+ entityStore: entityStore,
+ languages: userLanguages,
+ value: entity,
+ valueViewBuilder: wb.ValueViewBuilder.thisValues[0]
+ } );
+
+ wb.ValueViewBuilder.restore();
+ } );
+
+}( jQuery, wikibase, wikibase.view.ViewFactory ) );
diff --git a/view/tests/qunit/resources.php b/view/tests/qunit/resources.php
index e06c6c8..447ef14 100644
--- a/view/tests/qunit/resources.php
+++ b/view/tests/qunit/resources.php
@@ -15,6 +15,15 @@
$modules = array(
+ 'wikibase.view.ViewFactory.tests' => $moduleBase + array(
+ 'scripts' => array(
+ 'ViewFactory.tests.js',
+ ),
+ 'dependencies' => array(
+ 'wikibase.view.ViewFactory',
+ ),
+ ),
+
);
return $modules;
--
To view, visit https://gerrit.wikimedia.org/r/188357
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0ff09c7621f478bf05a87a072954d405971750eb
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Adrian Lang <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits