Henning Snater has uploaded a new change for review.
https://gerrit.wikimedia.org/r/190799
Change subject: Edit References along with Statement
......................................................................
Edit References along with Statement
The change switches to editing References along with Statements while the
functionality to
edit References individually is preserved. While the change strives to
integrated the
functionality only, no optical adjustments are applied.
Requires adjusting the Selenium tests.
- 87759
Change-Id: I9444ae579c297cc81689c4d95a38793a757f0c34
---
M lib/resources/jquery.wikibase/jquery.wikibase.itemview.js
M lib/resources/jquery.wikibase/jquery.wikibase.propertyview.js
M lib/resources/jquery.wikibase/jquery.wikibase.referenceview.js
M lib/resources/jquery.wikibase/jquery.wikibase.snaklistview.js
M lib/resources/jquery.wikibase/jquery.wikibase.statementgrouplistview.js
M lib/resources/jquery.wikibase/jquery.wikibase.statementgroupview.js
M lib/resources/jquery.wikibase/jquery.wikibase.statementlistview.js
M lib/resources/jquery.wikibase/jquery.wikibase.statementview.js
M
lib/resources/jquery.wikibase/toolbar/controller/definitions/addtoolbar/statementview-referenceview.js
M
lib/resources/jquery.wikibase/toolbar/controller/definitions/edittoolbar/statementview.js
A
lib/resources/jquery.wikibase/toolbar/controller/definitions/removetoolbar/statementview-referenceview.js
M lib/resources/jquery.wikibase/toolbar/controller/resources.php
M repo/resources/Resources.php
M repo/resources/wikibase.ui.entityViewInit.js
14 files changed, 396 insertions(+), 111 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/99/190799/1
diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.itemview.js
b/lib/resources/jquery.wikibase/jquery.wikibase.itemview.js
index b398e48..de29190 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.itemview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.itemview.js
@@ -27,6 +27,10 @@
* @param {dataTypes.DataTypeStore} options.dataTypeStore
* Required by the `snakview` for retrieving and evaluating a proper
`dataTypes.DataType`
* object when interacting on a "value" `Variation`.
+ * @param {wikibase.entityChangers.ReferencesChanger}
[options.referencesChanger]
+ * Required if `Statement` `Reference`s should not be saved along with
each `Statement` but
+ * are supposed to be saved individually (e.g. by applying individual
edit toolbars to the
+ * `referenceview`s).
*/
$.widget( 'wikibase.itemview', PARENT, {
/**
@@ -36,7 +40,8 @@
options: {
entityStore: null,
valueViewBuilder: null,
- dataTypeStore: null
+ dataTypeStore: null,
+ referencesChanger: null
},
/**
@@ -88,7 +93,8 @@
entityType: this.options.value.getType(),
entityStore: this.options.entityStore,
valueViewBuilder: this.options.valueViewBuilder,
- entityChangersFactory:
this.options.entityChangersFactory
+ entityChangersFactory:
this.options.entityChangersFactory,
+ referencesChanger: this.options.referencesChanger
} )
.statementgrouplabelscroll();
diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.propertyview.js
b/lib/resources/jquery.wikibase/jquery.wikibase.propertyview.js
index 2df4fdf..eafd67d 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.propertyview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.propertyview.js
@@ -26,6 +26,10 @@
* @param {dataTypes.DataTypeStore} options.dataTypeStore
* Required by the `snakview` for retrieving and evaluating a proper
`dataTypes.DataType`
* object when interacting on a "value" `Variation`.
+ * @param {wikibase.entityChangers.ReferencesChanger}
[options.referencesChanger]
+ * Required if `Statement` `Reference`s should not be saved along with
each `Statement` but
+ * are supposed to be saved individually (e.g. by applying individual
edit toolbars to the
+ * `referenceview`s).
*/
$.widget( 'wikibase.propertyview', PARENT, {
/**
@@ -35,7 +39,8 @@
options: {
entityStore: null,
valueViewBuilder: null,
- dataTypeStore: null
+ dataTypeStore: null,
+ referencesChanger: null
},
/**
@@ -108,7 +113,8 @@
entityType: this.options.value.getType(),
entityStore: this.options.entityStore,
valueViewBuilder: this.options.valueViewBuilder,
- entityChangersFactory:
this.options.entityChangersFactory
+ entityChangersFactory:
this.options.entityChangersFactory,
+ referencesChanger: this.options.referencesChanger
} )
.statementgrouplabelscroll();
diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.referenceview.js
b/lib/resources/jquery.wikibase/jquery.wikibase.referenceview.js
index 30ae7d0..c541ba8 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.referenceview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.referenceview.js
@@ -21,15 +21,22 @@
*
* @param {Object} options
* @param {wikibase.datamodel.Reference|null} options.value
- * @param {string} options.statementGuid
+ * @param {string|null} [options.statementGuid]
* The GUID of the `Statement` the `Reference` represented by the
widget instance belongs to.
+ * Required only if the `Reference` is supposed to be saved
individually (`referencesChanger`
+ * option is defined). Else, the `Reference` is supposed to be saved
along with its
+ * `Statement` (e.g. by being part of a `statementview`) and will
receive the GUID from that
+ * context.
* @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.ReferencesChanger} options.referencesChanger
- * Required for saving the `Reference` represented by the widget
instance.
+ * @param {wikibase.entityChangers.ReferencesChanger}
[options.referencesChanger]
+ * Required for saving the `Reference` represented by the widget
instance. If omitted, the
+ * `referenceview` widget does not trigger saving the `Reference` it is
managing when
+ * stopping edit mode. Setting this option by providing a
`ReferencesChanger` instance
+ * requires the `statementGuid` option to be set as well.
* @param {string} [options.helpMessage=mw.msg(
'wikibase-claimview-snak-new-tooltip' )]
* End-user message explaining how to interact with the widget. The
message is most likely to
* be used inside the tooltip of the toolbar corresponding to the
widget.
@@ -97,13 +104,16 @@
* @protected
*
* @throws {Error} if a required option is not specified properly.
+ * @throws {Error} if `referencesChanger` option is defined but
`statementGuid` option is
+ * omitted.
*/
_create: function() {
- if(
- !this.options.statementGuid || !this.options.entityStore
- || !this.options.valueViewBuilder ||
!this.options.referencesChanger
- ) {
+ if( !this.options.entityStore || !this.options.valueViewBuilder
) {
throw new Error( 'Required option not specified
properly' );
+ }
+ if( this.options.referencesChanger &&
!this.options.statementGuid ) {
+ throw new Error( 'Would be unable to save a Reference
using the provided '
+ + 'ReferencesChanger without a statementGuid
being provided' );
}
PARENT.prototype._create.call( this );
@@ -153,7 +163,7 @@
var $snaklistview = $( event.target ).closest(
':wikibase-snaklistview' ),
snaklistview = $snaklistview.data(
'snaklistview' );
- if( snaklistview && !snaklistview.value() ) {
+ if( snaklistview &&
!snaklistview.value().length ) {
self.$listview.data( 'listview'
).removeItem( snaklistview.element );
}
}
@@ -433,15 +443,28 @@
* @return {Reference} return.done.savedReference
* @return {Function} return.fail
* @return {wikibase.api.RepoApiError} error
+ *
+ * @throws {Error} when no `ReferencesChanger` was supplied via options
and it is tried to save
+ * an invalid or empty `Reference`.
*/
_saveReferenceApiCall: function() {
var self = this,
guid = this.options.statementGuid;
- return this.options.referencesChanger.setReference( guid,
this.value() )
- .done( function( savedReference ) {
- self._updateReferenceHashClass( savedReference );
- } );
+ if( this.options.referencesChanger ) {
+ return this.options.referencesChanger.setReference(
guid, this.value() )
+ .done( function( savedReference ) {
+ self._updateReferenceHashClass( savedReference
);
+ } );
+ } else {
+ var reference = this.value();
+
+ if( !reference ) {
+ throw new Error( 'Trying to save an invalid or
empty Reference' );
+ }
+
+ return $.Deferred().resolve( reference ).promise();
+ }
},
/**
diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.snaklistview.js
b/lib/resources/jquery.wikibase/jquery.wikibase.snaklistview.js
index 2bfb07c..34e0ca4 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.snaklistview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.snaklistview.js
@@ -319,7 +319,7 @@
* committed).
*
* @param {wikibase.datamodel.SnakList} [snakList]
- * @return {wikibase.datamodel.SnakList|null|undefined}
+ * @return {wikibase.datamodel.SnakList|undefined}
*/
value: function( snakList ) {
if( snakList !== undefined ) {
diff --git
a/lib/resources/jquery.wikibase/jquery.wikibase.statementgrouplistview.js
b/lib/resources/jquery.wikibase/jquery.wikibase.statementgrouplistview.js
index 9fcf4c3..864e05e 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.statementgrouplistview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.statementgrouplistview.js
@@ -33,6 +33,10 @@
* @param {wikibase.entityChangers.EntityChangersFactory}
options.entityChangersFactory
* Required to store the `Reference`s gathered from the
`referenceview`s aggregated by the
* `statementview`.
+ * @param {wikibase.entityChangers.ReferencesChanger}
[options.referencesChanger]
+ * Required if `Statement` `Reference`s should not be saved along with
each `Statement` but
+ * are supposed to be saved individually (e.g. by applying individual
edit toolbars to the
+ * `referenceview`s).
* @param {dataTypes.DataTypeStore} options.dataTypeStore
* Required by the `snakview` for retrieving and evaluating a proper
`dataTypes.DataType`
* object when interacting on a "value" `Variation`.
@@ -54,6 +58,7 @@
entityStore: null,
valueViewBuilder: null,
entityChangersFactory: null,
+ referencesChanger: null,
dataTypeStore: null
},
@@ -131,7 +136,8 @@
dataTypeStore:
self.options.dataTypeStore,
entityStore:
self.options.entityStore,
valueViewBuilder:
self.options.valueViewBuilder,
- entityChangersFactory:
self.options.entityChangersFactory
+ entityChangersFactory:
self.options.entityChangersFactory,
+ referencesChanger:
self.options.referencesChanger
};
}
} ),
diff --git
a/lib/resources/jquery.wikibase/jquery.wikibase.statementgroupview.js
b/lib/resources/jquery.wikibase/jquery.wikibase.statementgroupview.js
index 39396ed..a20eb3e 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.statementgroupview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.statementgroupview.js
@@ -35,6 +35,10 @@
* @param {wikibase.entityChangers.EntityChangersFactory}
options.entityChangersFactory
* Required to store the `Reference`s gathered from the
`referenceview`s aggregated by the
* `statementview`.
+ * @param {wikibase.entityChangers.ReferencesChanger}
[options.referencesChanger]
+ * Required if `Statement` `Reference`s should not be saved along with
each `Statement` but
+ * are supposed to be saved individually (e.g. by applying individual
edit toolbars to the
+ * `referenceview`s).
* @param {dataTypes.DataTypeStore} options.dataTypeStore
* Required by the `snakview` for retrieving and evaluating a proper
`dataTypes.DataType`
* object when interacting on a "value" `Variation`.
@@ -67,6 +71,7 @@
entityStore: null,
valueViewBuilder: null,
entityChangersFactory: null,
+ referencesChanger: null,
dataTypeStore: null
},
@@ -177,6 +182,7 @@
entityStore: self.options.entityStore,
valueViewBuilder: self.options.valueViewBuilder,
entityChangersFactory:
self.options.entityChangersFactory,
+ referencesChanger: self.options.referencesChanger,
dataTypeStore: self.options.dataTypeStore
} );
},
diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.statementlistview.js
b/lib/resources/jquery.wikibase/jquery.wikibase.statementlistview.js
index cbe1525..75f7d08 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.statementlistview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.statementlistview.js
@@ -36,6 +36,10 @@
* @param {wikibase.entityChangers.EntityChangersFactory}
options.entityChangersFactory
* Required to store the `Reference`s gathered from the
`referenceview`s aggregated by the
* `statementview`.
+ * @param {wikibase.entityChangers.ReferencesChanger}
[options.referencesChanger]
+ * Required if `Statement` `Reference`s should not be saved along with
each `Statement` but
+ * are supposed to be saved individually (e.g. by applying individual
edit toolbars to the
+ * `referenceview`s).
* @param {dataTypes.DataTypeStore} options.dataTypeStore
* Required by the `snakview` for retrieving and evaluating a proper
`dataTypes.DataType`
* object when interacting on a "value" `Variation`.
@@ -84,6 +88,7 @@
entityStore: null,
valueViewBuilder: null,
entityChangersFactory: null,
+ referencesChanger: null,
dataTypeStore: null
},
@@ -189,10 +194,11 @@
property: !!(
value || propertyId )
}
},
- dataTypeStore: self.option(
'dataTypeStore' ),
- entityStore: self.option(
'entityStore' ),
- valueViewBuilder: self.option(
'valueViewBuilder' ),
- entityChangersFactory:
self.option( 'entityChangersFactory' ),
+ dataTypeStore:
self.options.dataTypeStore,
+ entityStore:
self.options.entityStore,
+ valueViewBuilder:
self.options.valueViewBuilder,
+ entityChangersFactory:
self.options.entityChangersFactory,
+ referencesChanger:
self.options.referencesChanger,
claimsChanger:
self._claimsChanger,
guidGenerator:
self.options.claimGuidGenerator
};
diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.statementview.js
b/lib/resources/jquery.wikibase/jquery.wikibase.statementview.js
index c5f7c95..a2da398 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.statementview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.statementview.js
@@ -42,9 +42,14 @@
* @param {wikibase.ValueViewBuilder} options.valueViewBuilder
* Required by the `snakview` interfacing a `snakview` "value"
`Variation` to
* `jQuery.valueview`.
- * @param {wikibase.entityChangers.EntityChangersFactory}
options.entityChangersFactory
+ * @param {wikibase.entityChangers.EntityChangersFactory}
[options.entityChangersFactory]
* Required to store the `Reference`s gathered from the
`referenceview`s aggregated by the
- * `statementview`.
+ * `statementview`. If omitted, it is assumed that `Reference`s are
updated (saved) along
+ * with the `Statement`s main `Snak`.
+ * @param {wikibase.entityChangers.ReferencesChanger}
[options.referencesChanger]
+ * Required if the `Statement`'s `Reference`s should not be saved along
with the `Statement`
+ * but are supposed to be saved individually (e.g. by applying
individual edit toolbars
+ * to the `referenceview`s).
* @param {dataTypes.DataTypeStore} options.dataTypeStore
* Required by the `snakview` for retrieving and evaluating a proper
`dataTypes.DataType`
* object when interacting on a "value" `Variation`.
@@ -102,6 +107,7 @@
claimsChanger: null,
dataTypeStore: null,
entityChangersFactory: null,
+ referencesChanger: null,
predefined: {
mainSnak: false
},
@@ -117,13 +123,8 @@
*/
_rankSelector: null,
- /**
- * Shortcut to the `ListItemAdapter` in use in the `listview` managing
the `referenceview`s.
- * @property {jQuery.wikibase.listview.ListItemAdapter}
- * @private
- */
- _referenceviewLia: null,
-
+ // TODO: Remove short-cut to reference as reference needs to be kept up
to date on re-rendering
+ // the listview widget; Implement referencelistview.
/**
* Shortcut to the `listview` managing the `referenceview`s.
* @property {jQuery.wikibase.listview}
@@ -139,12 +140,6 @@
_qualifiers: null,
/**
- * @property {wikibase.entityChangers.ReferencesChanger}
- * @private
- */
- _referencesChanger: null,
-
- /**
* @inheritdoc
* @protected
*
@@ -155,7 +150,6 @@
!this.options.entityStore
|| !this.options.valueViewBuilder
|| !this.options.claimsChanger
- || !this.options.entityChangersFactory
|| !this.options.dataTypeStore
|| !this.options.guidGenerator
) {
@@ -163,8 +157,6 @@
}
PARENT.prototype._create.call( this );
-
- this._referencesChanger =
this.options.entityChangersFactory.getReferencesChanger();
this._updateHelpMessage();
@@ -227,7 +219,8 @@
autoStartEditing: false,
dataTypeStore: this.options.dataTypeStore,
entityStore: this.options.entityStore,
- valueViewBuilder: this.options.valueViewBuilder
+ valueViewBuilder: this.options.valueViewBuilder,
+ referencesChanger: this.options.referencesChanger
} );
},
@@ -308,15 +301,10 @@
/**
* @private
*
- * @param {wikibase.datamodel.Statement} [statement]
+ * @param {wikibase.datamodel.Reference[]} [references]
*/
- _createReferences: function( statement ) {
- if( !statement ) {
- return;
- }
-
- var self = this,
- references = statement.getReferences();
+ _createReferencesListview: function( references ) {
+ var self = this;
var $listview = this.$references.children();
if( !$listview.length ) {
@@ -331,26 +319,29 @@
newItemOptionsFn: function( value ) {
return {
value: value || null,
- statementGuid:
self.options.value.getClaim().getGuid(),
+ statementGuid:
self.options.value
+ ?
self.options.value.getClaim().getGuid()
+ : null,
dataTypeStore:
self.options.dataTypeStore,
entityStore:
self.options.entityStore,
- valueViewBuilder:
self.options.valueViewBuilder,
- referencesChanger:
self._referencesChanger
+ valueViewBuilder:
self.options.valueViewBuilder
};
}
} ),
- value: references.toArray()
+ value: references
} );
this._referencesListview = $listview.data( 'listview' );
- this._referenceviewLia =
this._referencesListview.listItemAdapter();
+ var lia = this._referencesListview.listItemAdapter(),
+ prefix =
$.wikibase.referenceview.prototype.widgetEventPrefix;
$listview
.on( 'listviewitemadded listviewitemremoved', function( event,
value, $li ) {
if( event.target === $listview[0] ) {
self._drawReferencesCounter();
}
+ self._trigger( 'change' );
} )
.on( 'listviewenternewitem', function( event, $newLi ) {
if( event.target !== $listview[0] ) {
@@ -358,10 +349,9 @@
}
// Enter first item into the referenceview.
- self._referenceviewLia.liInstance( $newLi
).enterNewItem();
+ lia.liInstance( $newLi ).enterNewItem();
- var lia = self._referenceviewLia,
- liInstance = lia.liInstance( $newLi );
+ var liInstance = lia.liInstance( $newLi );
if ( !liInstance.value() ) {
$newLi
@@ -382,6 +372,10 @@
}
} );
}
+ } )
+ .on( prefix + 'change.' + this.widgetName, function( event ) {
+ event.stopPropagation();
+ self._trigger( 'change' );
} );
// Collapse references if there is at least one.
@@ -446,6 +440,7 @@
this.$mainSnak.off( '.' + this.widgetName );
this._destroyQualifiersListView();
+ this._destroyReferencesListview();
PARENT.prototype.destroy.call( this );
},
@@ -464,6 +459,19 @@
},
/**
+ * @private
+ */
+ _destroyReferencesListview: function() {
+ if( this._referencesListview ) {
+ this._referencesListview.destroy();
+ this.$references
+ .off( '.' + this.widgetName )
+ .empty();
+ this._referencesListview = null;
+ }
+ },
+
+ /**
* @inheritdoc
*/
draw: function() {
@@ -477,14 +485,23 @@
: this.option( 'predefined' ).mainSnak || null
);
- if( this.isInEditMode() ) {
+ if( this.isInEditMode()
+ || this.options.value
+ &&
this.options.value.getClaim().getQualifiers().length
+ && !this.$qualifiers.children().length
+ ) {
this._createQualifiersListview(
this.options.value
?
this.options.value.getClaim().getQualifiers()
: new wb.datamodel.SnakList()
);
}
- this._createReferences( this.options.value );
+
+ if( this.isInEditMode() || this.options.value ) {
+ this._createReferencesListview(
+ this.options.value ?
this.options.value.getReferences().toArray() : []
+ );
+ }
return $.Deferred().resolve().promise();
},
@@ -511,7 +528,20 @@
}
}
- if( !qualifiers.equals(
this.options.value.getClaim().getQualifiers().length ) ) {
+ if( !qualifiers.equals(
this.options.value.getClaim().getQualifiers() ) ) {
+ return false;
+ }
+
+ var currentReferences = new
wb.datamodel.ReferenceList();
+
+ $.each( this._referencesListview.value(), function() {
+ var reference = this.value();
+ if( reference ) {
+ currentReferences.addItem( this.value()
);
+ }
+ } );
+
+ if( !currentReferences.equals(
this.options.value.getReferences() ) ) {
return false;
}
}
@@ -565,8 +595,7 @@
* @return {wikibase.datamodel.Reference[]}
*/
_getReferences: function() {
- var self = this,
- references = [];
+ var references = [];
// If the statement is pending (not yet stored), the listview
widget for the references is
// not defined.
@@ -574,8 +603,10 @@
return references;
}
+ var lia = this._referencesListview.listItemAdapter();
+
$.each( this._referencesListview.items(), function( i, item ) {
- var referenceview = self._referenceviewLia.liInstance(
$( item ) ),
+ var referenceview = lia.liInstance( $( item ) ),
reference = referenceview ?
referenceview.value() : null;
if( reference ) {
references.push( reference );
@@ -589,13 +620,21 @@
* Removes a `referenceview` from the view's list of `referenceview`s.
*
* @param {jQuery.wikibase.referenceview} referenceview
+ *
+ * @throws {Error} if `entityChangersFactory` option providing a
+ * `wikibase.entityChangers.ReferencesChanger` is not set.
*/
remove: function( referenceview ) {
var self = this;
+ if( !this.options.entityChangersFactory ) {
+ throw new Error( 'entityChangersFactory option needs to
be set in order to save '
+ + 'Refernces separately' );
+ }
+
referenceview.disable();
- this._referencesChanger.removeReference(
+
this.options.entityChangersFactory.getReferencesChanger().removeReference(
this.value().getClaim().getGuid(),
referenceview.value()
)
@@ -624,8 +663,13 @@
* @private
*/
_drawReferencesCounter: function() {
- var numberOfValues =
this._referencesListview.nonEmptyItems().length,
+ var numberOfValues = 0,
+ numberOfPendingValues = 0;
+
+ if( this._referencesListview ) {
+ numberOfValues =
this._referencesListview.nonEmptyItems().length;
numberOfPendingValues =
this._referencesListview.items().length - numberOfValues;
+ }
// build a nice counter, displaying fixed and pending values:
var $counterMsg = wb.utilities.ui.buildPendingCounter(
@@ -649,11 +693,22 @@
PARENT.prototype.startEditing.call( self ).done(
function() {
self._rankSelector.startEditing();
+ var i;
+
if( self._qualifiers ) {
var snaklistviews =
self._qualifiers.value();
if( snaklistviews.length ) {
- for( var i = 0; i <
snaklistviews.length; i++ ) {
+ for( i = 0; i <
snaklistviews.length; i++ ) {
snaklistviews[i].startEditing();
+ }
+ }
+ }
+
+ if( self._referencesListview ) {
+ var referenceviews =
self._referencesListview.value();
+ if( referenceviews.length ) {
+ for( i = 0; i <
referenceviews.length; i++ ) {
+
referenceviews[i].startEditing();
}
}
}
@@ -677,7 +732,10 @@
this.$mainSnak.data( 'snakview' ).stopEditing(
dropValue );
}
this._stopEditingQualifiers( dropValue );
+ this._stopEditingReferences( dropValue );
this._rankSelector.stopEditing( dropValue );
+
+ this._drawReferencesCounter();
return PARENT.prototype._afterStopEditing.call( this, dropValue
);
},
@@ -717,6 +775,44 @@
if( qualifiers.length > 0 ) {
// Refill the qualifier listview with the initial (or
new initial) qualifiers:
this._createQualifiersListview( qualifiers );
+ }
+ },
+
+ /**
+ * @private
+ *
+ * @param {boolean} [dropValue=false]
+ */
+ _stopEditingReferences: function( dropValue ) {
+ var referenceviews,
+ i;
+
+ if( this._referencesListview ) {
+ var $referenceviews = this._referencesListview.items();
+ referenceviews = this._referencesListview.value();
+
+ if( referenceviews.length ) {
+ for( i = 0; i < referenceviews.length; i++ ) {
+ referenceviews[i].stopEditing(
dropValue );
+
+ if( dropValue
+ && !referenceviews[i].value()
+ && $.inArray(
referenceviews[i], $referenceviews ) !== -1
+ ) {
+
this._referencesListview.removeItem( referenceviews[i].element );
+ }
+ }
+ }
+ }
+
+ this._destroyReferencesListview();
+
+ var references = this.options.value ?
this.options.value.getReferences().toArray() : [];
+
+ if( references.length > 0 ) {
+ this._createReferencesListview( references );
+ this.$references.show();
+ this.$refsHeading.find( 'a' ).data( 'toggler'
).refresh();
}
},
@@ -809,6 +905,10 @@
this._qualifiers.option( key, value );
}
this._rankSelector.option( key, value );
+
+ if( !this.options.referencesChanger &&
this._referencesListview ) {
+ this._referencesListview.option( key, value );
+ }
}
return response;
diff --git
a/lib/resources/jquery.wikibase/toolbar/controller/definitions/addtoolbar/statementview-referenceview.js
b/lib/resources/jquery.wikibase/toolbar/controller/definitions/addtoolbar/statementview-referenceview.js
index 8c2c2be..ef62031 100644
---
a/lib/resources/jquery.wikibase/toolbar/controller/definitions/addtoolbar/statementview-referenceview.js
+++
b/lib/resources/jquery.wikibase/toolbar/controller/definitions/addtoolbar/statementview-referenceview.js
@@ -9,25 +9,40 @@
*/
$.wikibase.toolbarcontroller.definition( 'addtoolbar', {
id: 'statementview-referenceview',
- selector: '.wikibase-statementview-references',
+ selector: ':' + $.wikibase.statementview.prototype.namespace
+ + '-' + $.wikibase.statementview.prototype.widgetName,
events: {
- listviewcreate: function( event, toolbarController ) {
- var $listview = $( event.target ),
- listview = $listview.data( 'listview' ),
- lia = listview.listItemAdapter(),
- $node = $listview.parent();
+ 'statementviewafterstartediting listviewcreate': function(
event, toolbarcontroller ) {
+ var $statementview,
+ statementview,
+ $listview;
- if( !$node.hasClass(
'wikibase-statementview-references' ) ) {
- return;
+ if( event.type.indexOf( 'statementview' ) === 0 ) {
+ $statementview = $( event.target );
+ statementview = $statementview.data(
'statementview' );
+ $listview = statementview.$references.children(
':wikibase-listview' );
+ } else {
+ $listview = $( event.target );
+ $statementview = $listview.closest(
':wikibase-statementview' );
+ statementview = $statementview.data(
'statementview' );
+
+ if( !statementview.isInEditMode()
+ || $listview.parent()[0] !==
statementview.$references
+ ) {
+ return;
+ }
}
- $node
+ var listview = $listview.data( 'listview' ),
+ lia = listview.listItemAdapter();
+
+ statementview.$references
.addtoolbar( {
- $container: $( '<div/>' ).appendTo( $node ),
+ $container: $( '<div/>' ).appendTo(
statementview.$references ),
label: mw.msg( 'wikibase-addreference' )
} )
- .on( 'addtoolbaradd.addtoolbar', function( e ) {
- if( e.target !== $node.get( 0 ) ) {
+ .on( 'addtoolbaradd.addtoolbar', function( event ) {
+ if( event.target !==
statementview.$references[0] ) {
return;
}
@@ -39,42 +54,49 @@
// Re-focus "add" button after having added or
having cancelled adding a reference:
var eventName = lia.prefixedEvent(
'afterstopediting.addtoolbar' );
$listview.one( eventName, function( event ) {
- $node.data( 'addtoolbar' ).focus();
+ statementview.$references.data(
'addtoolbar' ).focus();
} );
-
- toolbarController.registerEventHandler(
- event.data.toolbar.type,
- event.data.toolbar.id,
- 'listviewdestroy',
- function( event, toolbarController ) {
- var $listview = $( event.target
),
- $node =
$listview.parent();
-
- if( !$node.hasClass(
'.wikibase-statementview-references' ) ) {
- return;
- }
-
-
toolbarController.destroyToolbar( $node.data( 'addtoolbar' ) );
- $node.off( 'addtoolbar' );
- }
- );
} );
+ },
+ 'statementviewafterstopediting listviewdestroy': function(
event, toolbarcontroller ) {
+ var $statementview,
+ statementview;
- toolbarController.registerEventHandler(
- event.data.toolbar.type,
- event.data.toolbar.id,
- 'listviewdisable',
- function( event ) {
- if( event.target !== $listview.get( 0 )
) {
- return;
- }
- $node.data( 'addtoolbar' )[
- listview.option( 'disabled' )
- ? 'disable'
- : 'enable'
- ]();
+ if( event.type.indexOf( 'statementview' ) === 0 ) {
+ $statementview = $( event.target );
+ statementview = $statementview.data(
'statementview' );
+ } else {
+ var $listview = $( event.target );
+ $statementview = $listview.closest(
':wikibase-statementview' );
+ statementview = $statementview.data(
'statementview' );
+
+ if( $listview.parent()[0] !==
statementview.$references ) {
+ return;
}
- );
+ }
+
+ var addtoolbar = statementview.$references.data(
'addtoolbar' );
+
+ if( addtoolbar ) {
+ toolbarcontroller.destroyToolbar( addtoolbar );
+ }
+ statementview.$references.off( '.addtoolbar' );
+ },
+ listviewdisable: function( event ) {
+ var $listview = $( event.target ),
+ $statementview = $listview.closest(
':wikibase-statementview' ),
+ statementview = $statementview.data(
'statementview' );
+
+ if( $listview.parent()[0] !==
statementview.$references[0] ) {
+ return;
+ }
+
+ var listview = $listview.data( 'listview' ),
+ addtoolbar = statementview.$references.data(
'addtoolbar' );
+
+ if( addtoolbar ) {
+ addtoolbar.option( 'disabled', listview.option(
'disabled' ) );
+ }
}
}
} );
diff --git
a/lib/resources/jquery.wikibase/toolbar/controller/definitions/edittoolbar/statementview.js
b/lib/resources/jquery.wikibase/toolbar/controller/definitions/edittoolbar/statementview.js
index f0fc94d..1472d52 100644
---
a/lib/resources/jquery.wikibase/toolbar/controller/definitions/edittoolbar/statementview.js
+++
b/lib/resources/jquery.wikibase/toolbar/controller/definitions/edittoolbar/statementview.js
@@ -106,6 +106,10 @@
return;
}
+ if( !statementview.$references.is( ':visible' ) ) {
+ statementview.$refsHeading.find( 'a' ).click();
+ }
+
statementview.focus();
}
}
diff --git
a/lib/resources/jquery.wikibase/toolbar/controller/definitions/removetoolbar/statementview-referenceview.js
b/lib/resources/jquery.wikibase/toolbar/controller/definitions/removetoolbar/statementview-referenceview.js
new file mode 100644
index 0000000..9dac419
--- /dev/null
+++
b/lib/resources/jquery.wikibase/toolbar/controller/definitions/removetoolbar/statementview-referenceview.js
@@ -0,0 +1,91 @@
+( function( $ ) {
+ 'use strict';
+
+/**
+ * @ignore
+ *
+ * @licence GNU GPL v2+
+ * @author H. Snater < [email protected] >
+ */
+$.wikibase.toolbarcontroller.definition( 'removetoolbar', {
+ id: 'statementview-referenceview',
+ selector: ':' + $.wikibase.statementview.prototype.namespace
+ + '-' + $.wikibase.statementview.prototype.widgetName,
+ events: {
+ 'statementviewafterstartediting referenceviewcreate': function(
event, toolbarController ) {
+ var $statementview,
+ statementview,
+ $referenceview;
+
+ if( event.type.indexOf( 'statementview' ) === 0 ) {
+ $statementview = $( event.target );
+ statementview = $statementview.data(
'statementview' );
+ $referenceview =
statementview.$references.find( ':wikibase-referenceview' );
+ } else {
+ $referenceview = $( event.target );
+ $statementview = $referenceview.closest(
':wikibase-statementview' );
+ statementview = $statementview.data(
'statementview' );
+
+ if( !statementview.isInEditMode() ) {
+ return;
+ }
+ }
+
+ $referenceview.each( function() {
+ var $referenceview = $( this ),
+ $container = $referenceview.find(
'.wikibase-toolbar-container' );
+
+ if( !$container.length ) {
+ $container = $( '<div/>' ).appendTo(
+ $referenceview.find(
'.wikibase-referenceview-heading' )
+ );
+ }
+
+ $referenceview
+ .removetoolbar( {
+ $container: $container
+ } )
+ .on( 'removetoolbarremove.removetoolbar',
function( event ) {
+ var $suspectedReferenceview = $(
event.target );
+
+ if( $suspectedReferenceview[0] ===
$referenceview[0] ) {
+
statementview.$references.children( ':wikibase-listview' )
+ .data( 'listview'
).removeItem( $referenceview );
+ }
+ } );
+ } );
+ },
+ 'statementviewafterstopediting referenceviewdestroy': function(
event, toolbarcontroller ) {
+ var $referenceview;
+
+ if( event.type === 'statementviewafterstopediting' ) {
+ var $statementview = $( event.target ),
+ statementview = $statementview.data(
'statementview' );
+ $referenceview =
statementview.$references.find( ':wikibase-referenceview' );
+ } else {
+ $referenceview = $( event.target );
+ }
+
+ $referenceview.each( function() {
+ var $referenceview = $( this ),
+ removetoolbar = $referenceview.data(
'removetoolbar' );
+
+ if( removetoolbar ) {
+ toolbarcontroller.destroyToolbar(
removetoolbar );
+ }
+ $referenceview.off( '.removetoolbar' );
+ } );
+ },
+ referenceviewdisable: function( event ) {
+ var $referenceview = $( event.target ),
+ referenceview = $referenceview.data(
'referenceview' ),
+ removetoolbar = $referenceview.data(
'removetoolbar' );
+
+ if( removetoolbar ) {
+ removetoolbar.option( 'disabled',
referenceview.option( 'disabled' ) );
+ }
+ }
+ }
+} );
+
+}( jQuery ) );
diff --git a/lib/resources/jquery.wikibase/toolbar/controller/resources.php
b/lib/resources/jquery.wikibase/toolbar/controller/resources.php
index f2c8548..d701924 100644
--- a/lib/resources/jquery.wikibase/toolbar/controller/resources.php
+++ b/lib/resources/jquery.wikibase/toolbar/controller/resources.php
@@ -56,6 +56,7 @@
),
'dependencies' => array(
'jquery.wikibase.addtoolbar',
+ 'jquery.wikibase.listview',
'jquery.wikibase.statementview',
'jquery.wikibase.toolbarcontroller',
),
@@ -148,6 +149,19 @@
),
),
+
'jquery.wikibase.toolbarcontroller.definitions.removetoolbar.statementview-referenceview'
=> $moduleTemplate + array(
+ 'scripts' => array(
+
'definitions/removetoolbar/statementview-referenceview.js',
+ ),
+ 'dependencies' => array(
+ 'jquery.wikibase.listview',
+ 'jquery.wikibase.referenceview',
+ 'jquery.wikibase.removetoolbar',
+ 'jquery.wikibase.statementview',
+ 'jquery.wikibase.toolbarcontroller',
+ ),
+ ),
+
'jquery.wikibase.toolbarcontroller.definitions.removetoolbar.statementview-snakview'
=> $moduleTemplate + array(
'scripts' => array(
'definitions/removetoolbar/statementview-snakview.js',
diff --git a/repo/resources/Resources.php b/repo/resources/Resources.php
index 9f7ff08..84f5f0b 100644
--- a/repo/resources/Resources.php
+++ b/repo/resources/Resources.php
@@ -162,6 +162,7 @@
'jquery.wikibase.toolbarcontroller.definitions.edittoolbar.statementview',
'jquery.wikibase.toolbarcontroller.definitions.removetoolbar.referenceview-snakview',
'jquery.wikibase.toolbarcontroller.definitions.removetoolbar.sitelinkgroupview-sitelinkview',
+
'jquery.wikibase.toolbarcontroller.definitions.removetoolbar.statementview-referenceview',
'jquery.wikibase.toolbarcontroller.definitions.removetoolbar.statementview-snakview',
'jquery.wikibase.wbtooltip',
'jquery.cookie',
diff --git a/repo/resources/wikibase.ui.entityViewInit.js
b/repo/resources/wikibase.ui.entityViewInit.js
index d225ae6..daab92a 100644
--- a/repo/resources/wikibase.ui.entityViewInit.js
+++ b/repo/resources/wikibase.ui.entityViewInit.js
@@ -73,11 +73,11 @@
edittoolbar: [
'statementview',
'entitytermsview',
- 'referenceview',
'sitelinkgroupview'
],
removetoolbar: [
'statementview-snakview',
+ 'statementview-referenceview',
'referenceview-snakview',
'sitelinkgroupview-sitelinkview'
]
--
To view, visit https://gerrit.wikimedia.org/r/190799
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I9444ae579c297cc81689c4d95a38793a757f0c34
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Henning Snater <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits