Mooeypoo has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/197774

Change subject: Use 'rerender' event for generated content in citoid inspector
......................................................................

Use 'rerender' event for generated content in citoid inspector

Replace the deprecated and evil 'DOMSubtreeModified' event and,
instead, use the generated node's 'rerender' event to update the
inspector that the widgets are rendered and ready.

We do this by creating a promise within the widget that resolves
when the widget is rendered. The inspector can then wait for the
promise to resolve before switching the ui to the results panel.

Change-Id: Iba36b4428c3ab8b704e8ecbafe66be2c188597a3
---
M modules/ve.ui.CiteFromIdInspector.js
M modules/ve.ui.CiteFromIdReferenceWidget.js
2 files changed, 41 insertions(+), 26 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Citoid 
refs/changes/74/197774/1

diff --git a/modules/ve.ui.CiteFromIdInspector.js 
b/modules/ve.ui.CiteFromIdInspector.js
index 8700e4e..d9016c5 100644
--- a/modules/ve.ui.CiteFromIdInspector.js
+++ b/modules/ve.ui.CiteFromIdInspector.js
@@ -170,8 +170,7 @@
        this.lookupInput.connect( this, { change: 'onLookupInputChange' } );
        this.lookupButton.connect( this, { click: 'onLookupButtonClick' } );
        this.previewSelectWidget.connect( this, {
-               choose: 'onPreviewSelectWidgetChoose',
-               update: 'onPreviewSelectWidgetUpdate'
+               choose: 'onPreviewSelectWidgetChoose'
        } );
 
        this.panels.addItems( [
@@ -257,13 +256,6 @@
 ve.ui.CiteFromIdInspector.prototype.onFormSubmit = function () {
        this.executeAction( 'lookup' );
        return false;
-};
-
-/**
- * Respond to item update event in the preview select widget
- */
-ve.ui.CiteFromIdInspector.prototype.onPreviewSelectWidgetUpdate = function () {
-       this.updateSize();
 };
 
 /**
@@ -449,10 +441,12 @@
                        // Success
                        function ( searchResults ) {
                                // Apply staging
-                               inspector.lookupInput.popPending();
-                               inspector.lookupButton.setDisabled( false );
-                               inspector.switchPanels( 'result' );
-                               return inspector.buildTemplateResults( 
searchResults );
+                               inspector.buildTemplateResults( searchResults )
+                                       .then( function () {
+                                               
inspector.lookupInput.popPending();
+                                               
inspector.lookupButton.setDisabled( false );
+                                               inspector.switchPanels( 
'result' );
+                                       } );
                        },
                        // Fail
                        function () {
@@ -474,7 +468,8 @@
  *  or is rejected if there are any problems with the template name or the 
internal item.
  */
 ve.ui.CiteFromIdInspector.prototype.buildTemplateResults = function ( 
searchResults ) {
-       var i, templateName, citation, result,
+       var i, templateName, citation, result, refWidget,
+               renderPromises = [],
                partPromises = [],
                inspector = this;
 
@@ -510,18 +505,20 @@
                        var optionWidgets = [];
                        // Create option widgets
                        for ( i = 0; i < inspector.results.length; i++ ) {
-                               optionWidgets.push( new 
ve.ui.CiteFromIdReferenceWidget(
+                               refWidget = new ve.ui.CiteFromIdReferenceWidget(
                                        
inspector.getFragment().getSurface().getDocument(),
                                        {
                                                data: i,
                                                transclusionModel: 
inspector.results[i].transclusionModel,
                                                templateName: 
inspector.results[i].templateName,
                                                citeTools: inspector.citeTools
-                                       } ) );
+                                       } );
+                               optionWidgets.push( refWidget );
+                               renderPromises.push( 
refWidget.getRenderPromise() );
                        }
                        // Add to the select widget
                        inspector.previewSelectWidget.addItems( optionWidgets );
-                       inspector.previewSelectWidget.toggle( true );
+                       return $.when.apply( $, renderPromises );
                } );
 };
 
diff --git a/modules/ve.ui.CiteFromIdReferenceWidget.js 
b/modules/ve.ui.CiteFromIdReferenceWidget.js
index 0223d17..c978d4c 100644
--- a/modules/ve.ui.CiteFromIdReferenceWidget.js
+++ b/modules/ve.ui.CiteFromIdReferenceWidget.js
@@ -5,7 +5,7 @@
  * @param {Object} config Dialog configuration object
  */
 ve.ui.CiteFromIdReferenceWidget = function VeUiCiteFromIdReferenceWidget( 
documentModel, config ) {
-       var i, len, icon, item, title, uiSurface,
+       var i, len, icon, item, title, uiSurface, node,
                widget = this;
 
        config = config || {};
@@ -15,6 +15,8 @@
        this.template = config.template;
        this.transclusionModel = config.transclusionModel;
        this.title = this.templateName;
+
+       this.renderPromise = $.Deferred();
 
        // Parent constructor
        ve.ui.CiteFromIdReferenceWidget.super.call( this, config );
@@ -57,19 +59,18 @@
                                { type: '/internalList' }
                        ]
                ) );
+       // HACK: We need the view to be initialized in order for the 'rerender' 
event
+       // to be emitted on the generated node.
+       uiSurface.getView().initialize();
+       node = 
uiSurface.getView().getDocument().getDocumentNode().getChildren()[0];
+       node.connect( this, { rerender: 'onNodeRerender' } );
+
        this.$referenceWrapper = $( '<div>' )
                .addClass( 've-ui-citeFromIdReferenceWidget-wrapper' )
-               // HACK: We want to update the size of the inspector according 
to the
-               // size of this widget, and for that we need to know when the 
generated
-               // node is done generating. This should be fixed at some point 
to not
-               // require listening DOMSubtreeModified event.
-               .on( 'DOMSubtreeModified', ve.debounce( function () {
-                       widget.emit( 'update' );
-               }, 100 ) )
                .on( 'click mousedown', function ( e ) {
                        e.preventDefault();
                } )
-               .append( 
uiSurface.view.documentView.documentNode.children[0].$element );
+               .append( node.$element );
 
        // Display the preview
        title = new OO.ui.LabelWidget( {
@@ -98,9 +99,26 @@
 /* Methods */
 
 /**
+ * Respond to finalizing the rendering of the generatedContents in the
+ * node by resolving the render promise.
+ */
+ve.ui.CiteFromIdReferenceWidget.prototype.onNodeRerender = function () {
+       this.renderPromise.resolve();
+};
+
+/**
  * Respond to insert button click event
  * @fires insert
  */
 ve.ui.CiteFromIdReferenceWidget.prototype.onInsertButtonClick = function () {
        this.emit( 'insert', this.data );
 };
+
+/**
+ * Get the render promise associated with the node.
+ * @return {jQuery.Promise} Rendering promise resolved when the rendering
+ * of the node is completed.
+ */
+ve.ui.CiteFromIdReferenceWidget.prototype.getRenderPromise = function () {
+       return this.renderPromise;
+};

-- 
To view, visit https://gerrit.wikimedia.org/r/197774
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iba36b4428c3ab8b704e8ecbafe66be2c188597a3
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Citoid
Gerrit-Branch: master
Gerrit-Owner: Mooeypoo <mor...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to