Mooeypoo has uploaded a new change for review. https://gerrit.wikimedia.org/r/204129
Change subject: Create a preview widget for generated content nodes ...................................................................... Create a preview widget for generated content nodes Preview widget waits for the generated content node CE to render and then replces its content with dm html. Change-Id: Ia7e96e048e4bf881482d59d484dacaf7b2601ff9 --- M build/modules.json A src/ui/widgets/ve.ui.PreviewWidget.js 2 files changed, 106 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor refs/changes/29/204129/1 diff --git a/build/modules.json b/build/modules.json index 6e225b8..eff8964 100644 --- a/build/modules.json +++ b/build/modules.json @@ -424,6 +424,7 @@ "src/ui/widgets/ve.ui.ContextOptionWidget.js", "src/ui/widgets/ve.ui.DimensionsWidget.js", "src/ui/widgets/ve.ui.MediaSizeWidget.js", + "src/ui/widgets/ve.ui.PreviewWidget.js", "src/ui/widgets/ve.ui.WhitespacePreservingTextInputWidget.js", "src/ui/tools/ve.ui.AnnotationTool.js", "src/ui/tools/ve.ui.ClearAnnotationTool.js", diff --git a/src/ui/widgets/ve.ui.PreviewWidget.js b/src/ui/widgets/ve.ui.PreviewWidget.js new file mode 100644 index 0000000..e5883f0 --- /dev/null +++ b/src/ui/widgets/ve.ui.PreviewWidget.js @@ -0,0 +1,105 @@ +/*! + * VisualEditor UserInterface PreviewWidget class. + * + * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/** + * Creates an ve.ui.PreviewWidget object. + * + * @class + * @extends OO.ui.Widget + * + * @constructor + * @param {ve.dm.Node} nodeModel Model from which to create a preview + * @param {Object} [config] Configuration options + */ +ve.ui.PreviewWidget = function VeUiMWReferencePreviewWidget( nodeModel, config ) { + var promises = [], + counter = 0, + widget = this; + + // Parent constructor + OO.ui.Widget.call( this, config ); + + this.model = nodeModel; + + // Initial CE node + this.rendering = ve.ce.nodeFactory.create( this.model.getType(), this.model ); + + // Traverse children to see when they are all rerendered + if ( this.rendering instanceof ve.ce.BranchNode ) { + ve.BranchNode.static.traverse( this.rendering, function ( node ) { + if ( typeof node.generateContents === 'function' ) { + if ( node.isGenerating() ) { + promises[counter] = $.Deferred(); + node.once( 'rerender', promises[counter].resolve ); + counter++; + } + } + } ); + } else if ( typeof this.rendering.generateContents === 'function' ) { + if ( this.rendering.isGenerating() ) { + promises[counter] = $.Deferred(); + this.rendering.once( 'rerender', promises[counter].resolve ); + counter++; + } + } + + // When all children are rerendered, replace with dm DOM + $.when.apply( $, promises ) + .then( function () { + // Verify that the widget and/or the ce node weren't destroyed + if ( widget.rendering ) { + widget.replaceWithModelDom(); + } + } ); + + // Initialize + this.$element.addClass( 've-ui-mWReferencePreviewWidget' ); +}; + +/* Inheritance */ + +OO.inheritClass( ve.ui.PreviewWidget, OO.ui.Widget ); + +/** + * Destroy the preview node. + */ +ve.ui.PreviewWidget.prototype.destroy = function () { + if ( this.rendering ) { + this.rendering.destroy(); + this.rendering = null; + } +}; + +/** + * Replace the content of the body with the model DOM + * @fires render + */ +ve.ui.PreviewWidget.prototype.replaceWithModelDom = function () { + var preview = ve.dm.converter.getDomFromModel( this.model.getDocument(), true ), + $preview = $( preview.body ); + + // Make all links open in a new window (sync rendering) + $preview.find( 'a' ).attr( 'target', '_blank' ); + + // Replace content + this.$element.empty().append( $preview.contents() ); + + // Event + this.emit( 'render' ); + + // Cleanup + this.rendering.destroy(); + this.rendering = null; +}; + +/** + * Check if the preview is still generating + * @return {boolean} Still generating + */ +ve.ui.PreviewWidget.prototype.isGenerating = function () { + return this.rendering && this.rendering.isGenerating(); +}; -- To view, visit https://gerrit.wikimedia.org/r/204129 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ia7e96e048e4bf881482d59d484dacaf7b2601ff9 Gerrit-PatchSet: 1 Gerrit-Project: VisualEditor/VisualEditor 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