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

Reply via email to