Adrian Lang has uploaded a new change for review.
https://gerrit.wikimedia.org/r/248833
Change subject: [WIP] Controller
......................................................................
[WIP] Controller
Bug: ?
Change-Id: I7ff95a3412d6ed08967ef9d52f807efdce8d545f
---
M view/resources/jquery/wikibase/jquery.wikibase.referenceview.js
M
view/resources/jquery/wikibase/toolbar/controller/definitions/edittoolbar/referenceview.js
M view/resources/jquery/wikibase/toolbar/controller/resources.php
A view/resources/wikibase/Controller.js
M view/resources/wikibase/resources.php
5 files changed, 119 insertions(+), 99 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/33/248833/1
diff --git a/view/resources/jquery/wikibase/jquery.wikibase.referenceview.js
b/view/resources/jquery/wikibase/jquery.wikibase.referenceview.js
index a33f276..b88c93b 100644
--- a/view/resources/jquery/wikibase/jquery.wikibase.referenceview.js
+++ b/view/resources/jquery/wikibase/jquery.wikibase.referenceview.js
@@ -220,6 +220,7 @@
return;
}
+ // FIXME: There should be a listview::startEditing method
$.each( this.$listview.data( 'listview' ).value(), function() {
this.startEditing();
} );
@@ -236,56 +237,20 @@
* Stops the widget's edit mode.
* @since 0.5
*/
- stopEditing: function( dropValue ) {
- if ( !this.isInEditMode() || ( !this.isValid() ||
this.isInitialValue() ) && !dropValue ) {
+ stopEditing: function() {
+ if ( !this.isInEditMode() ) {
return;
}
- this._trigger( 'stopediting', null, [dropValue] );
+ this._isInEditMode = false;
+ this.element.removeClass( 'wb-edit' );
- var self = this;
-
- this.element.removeClass( 'wb-error' );
this._detachEditModeEventHandlers();
- this.disable();
- if ( dropValue ) {
- this._stopEditingReferenceSnaks();
+ // FIXME: There should be a listview::stopEditing method
+ this._stopEditingReferenceSnaks();
- this.enable();
- this.element.removeClass( 'wb-edit' );
- this._isInEditMode = false;
-
- this._trigger( 'afterstopediting', null, [ dropValue ]
);
- } else {
- this._saveReferenceApiCall()
- .done( function( savedReference ) {
- self.options.value = savedReference;
-
- self._stopEditingReferenceSnaks();
-
- self.enable();
-
- self.element.removeClass( 'wb-edit' );
- self._isInEditMode = false;
-
- self._trigger( 'afterstopediting', null, [
dropValue ] );
- } )
- .fail( function( error ) {
- self.enable();
-
- self._attachEditModeEventHandlers();
- self.setError( error );
- } );
- }
- },
-
- /**
- * Cancels edit mode.
- * @since 0.5
- */
- cancelEditing: function() {
- this.stopEditing( true );
+ this._trigger( 'afterstopediting' );
},
/**
@@ -377,39 +342,12 @@
},
/**
- * Triggers the API call to save the reference.
- * @see wikibase.entityChangers.ReferencesChanger.setReference
- * @private
- *
- * @return {Object} jQuery.Promise
- * @return {Function} return.done
- * @return {Reference} return.done.savedReference
- * @return {Function} return.fail
- * @return {wikibase.api.RepoApiError} return.fail.error
- */
- _saveReferenceApiCall: function() {
- var self = this,
- guid = this.options.statementGuid;
-
- return this.options.referencesChanger.setReference( guid,
this.value() )
- .done( function( savedReference ) {
- self._updateReferenceHashClass( savedReference );
- } );
- },
-
- /**
* Sets/removes error state from the widget.
*
- * @param {wikibase.api.RepoApiError} [error]
+ * @param {Boolean} error
*/
setError: function( error ) {
- if ( error ) {
- this.element.addClass( 'wb-error' );
- this._trigger( 'toggleerror', null, [ error ] );
- } else {
- this.element.removeClass( 'wb-error' );
- this._trigger( 'toggleerror' );
- }
+ this.element.toggleClass( 'wb-error', error );
},
/**
@@ -425,6 +363,7 @@
throw new Error( 'Value has to be an instance
of wikibase.datamodel.Reference' );
}
// TODO: Redraw
+ this._updateReferenceHashClass( value );
}
var response = PARENT.prototype._setOption.apply( this,
arguments );
@@ -449,20 +388,8 @@
} else {
this.element.focus();
}
- },
-
- /**
- * Get a help message related to editing
- *
- * @return {Object} jQuery promise
- * Resolved parameters:
- * - {string}
- * No rejected parameters.
- */
- getHelpMessage: function() {
- // FIXME: Remove this once referenceview is an
EditableTemplatedWidget
- return $.Deferred().resolve( this.options.helpMessage
).promise();
}
+
} );
}( mediaWiki, wikibase, jQuery ) );
diff --git
a/view/resources/jquery/wikibase/toolbar/controller/definitions/edittoolbar/referenceview.js
b/view/resources/jquery/wikibase/toolbar/controller/definitions/edittoolbar/referenceview.js
index 6022161..123aa9c 100644
---
a/view/resources/jquery/wikibase/toolbar/controller/definitions/edittoolbar/referenceview.js
+++
b/view/resources/jquery/wikibase/toolbar/controller/definitions/edittoolbar/referenceview.js
@@ -42,7 +42,32 @@
};
}
+ var controller;
+ var bridge = {
+ cancelEditing: function() { return
controller.cancelEditing.apply( controller, arguments ); },
+ element: $referenceview,
+ getHelpMessage: function() {
+ return $.Deferred().resolve(
referenceview.options.helpMessage ).promise();
+ },
+ startEditing: function() { return
controller.startEditing.apply( controller, arguments ); },
+ stopEditing: function() { return
controller.stopEditing.apply( controller, arguments ); },
+ setError: function() { return
controller.setError.apply( controller, arguments ); }
+ };
+ options.interactionWidget = bridge;
+
$referenceview.edittoolbar( options );
+
+ var guid = referenceview.options.statementGuid;
+ var referencesChanger =
referenceview.options.referencesChanger;
+ controller = new wikibase.Controller( {
+ view: referenceview,
+ toolbar: $referenceview.data( 'edittoolbar' ),
+ model: {
+ save: function( reference ) {
+ return
referencesChanger.setReference( guid, reference );
+ }
+ }
+ } );
$referenceview.on( 'keydown.edittoolbar', function(
event ) {
if ( referenceview.option( 'disabled' ) ) {
@@ -54,20 +79,6 @@
referenceview.stopEditing( false );
}
} );
- },
- 'referenceviewchange referenceviewafterstartediting': function(
event ) {
- var $referenceview = $( event.target ),
- referenceview = $referenceview.data(
'referenceview' ),
- edittoolbar = $referenceview.data(
'edittoolbar' );
-
- if ( !edittoolbar ) {
- return;
- }
-
- var btnSave = edittoolbar.getButton( 'save' ),
- enableSave = referenceview.isValid() &&
!referenceview.isInitialValue();
-
- btnSave[enableSave ? 'enable' : 'disable']();
},
referenceviewdisable: function( event ) {
var $referenceview = $( event.target ),
diff --git a/view/resources/jquery/wikibase/toolbar/controller/resources.php
b/view/resources/jquery/wikibase/toolbar/controller/resources.php
index 7362dc1..b79b37f 100644
--- a/view/resources/jquery/wikibase/toolbar/controller/resources.php
+++ b/view/resources/jquery/wikibase/toolbar/controller/resources.php
@@ -102,6 +102,7 @@
'jquery.wikibase.edittoolbar',
'jquery.wikibase.referenceview',
'jquery.wikibase.toolbarcontroller',
+ 'wikibase.Controller'
),
),
diff --git a/view/resources/wikibase/Controller.js
b/view/resources/wikibase/Controller.js
new file mode 100644
index 0000000..74d19fc
--- /dev/null
+++ b/view/resources/wikibase/Controller.js
@@ -0,0 +1,76 @@
+( function( mw ) {
+'use strict';
+
+wikibase.Controller = function( options ) {
+ this._model = options.model;
+ this._toolbar = options.toolbar;
+ this._view = options.view;
+};
+
+wikibase.Controller.prototype.startEditing = function() {
+ this._view.startEditing();
+ this._toolbar.toEditMode();
+
+ this._updateSaveButtonState();
+ this._view.element.on( this._view.widgetEventPrefix + 'change',
jQuery.proxy( this._updateSaveButtonState, this ) );
+};
+
+wikibase.Controller.prototype._updateSaveButtonState = function() {
+ var btnSave = this._toolbar.getButton( 'save' ),
+ enableSave = this._view.isValid() &&
!this._view.isInitialValue();
+
+ btnSave[enableSave ? 'enable' : 'disable']();
+};
+
+wikibase.Controller.prototype.stopEditing = function( dropValue ) {
+ var view = this._view,
+ self = this;
+
+ if ( ( !view.isValid() || view.isInitialValue() ) && !dropValue ) {
+ return;
+ }
+
+ this._toolbar.disable();
+
+ this.setError();
+ view.disable();
+
+ if( dropValue ) {
+ // FIXME: Shouldn't we re-set the value here?
+ this._leaveEditMode();
+ return;
+ }
+
+ this._toolbar.toggleActionMessage( mw.msg( 'wikibase-save-inprogress' )
);
+ this.saveValue( view.value() ).done( function( savedValue ) {
+ view.value( savedValue );
+ self._toolbar.toggleActionMessage();
+ self._leaveEditMode();
+ } ).fail( function( error ) {
+ view.enable();
+ this.setError( error );
+ } );
+};
+
+wikibase.Controller.prototype._leaveEditMode = function() {
+ this._view.enable();
+ this._view.stopEditing();
+
+ this._toolbar.enable();
+ this._toolbar.toNonEditMode();
+};
+
+wikibase.Controller.prototype.cancelEditing = function() {
+ return this.stopEditing( true );
+};
+
+wikibase.Controller.prototype.saveValue = function( value ) {
+ return this._model.save( value );
+};
+
+wikibase.Controller.prototype.setError = function( error ) {
+ this._view.setError( Boolean( error ) );
+ // FIXME: trigger toggleerror
+};
+
+} )( mediaWiki );
diff --git a/view/resources/wikibase/resources.php
b/view/resources/wikibase/resources.php
index 962006c..a1fca2f 100644
--- a/view/resources/wikibase/resources.php
+++ b/view/resources/wikibase/resources.php
@@ -16,6 +16,11 @@
$modules = array(
+ 'wikibase.Controller' => $moduleTemplate + array(
+ 'scripts' => 'Controller.js',
+ 'dependencies' => 'wikibase'
+ ),
+
// common styles independent from JavaScript being enabled or
disabled
'wikibase.common' => $moduleTemplate + array(
'position' => 'top',
--
To view, visit https://gerrit.wikimedia.org/r/248833
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I7ff95a3412d6ed08967ef9d52f807efdce8d545f
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