diff --git a/extension.json b/extension.json index 24985cf06b..748c9a3b85 100644 --- a/extension.json +++ b/extension.json @@ -444,7 +444,8 @@ }, "ext.visualEditor.collabTarget": { "scripts": [ - "modules/ve-mw-collab/ve.init.mw.CollabTarget.js" + "modules/ve-mw-collab/ve.init.mw.CollabTarget.js", + "modules/ve-mw-collab/ve.ui.MWExportWikitextDialog.js" ], "dependencies": [ "ext.visualEditor.targetLoader", diff --git a/modules/ve-mw-collab/ve.init.mw.CollabTarget.js b/modules/ve-mw-collab/ve.init.mw.CollabTarget.js index ec1a814b0b..cfc9bb2718 100644 --- a/modules/ve-mw-collab/ve.init.mw.CollabTarget.js +++ b/modules/ve-mw-collab/ve.init.mw.CollabTarget.js @@ -102,10 +102,35 @@ ve.init.mw.CollabTarget.prototype.restorePage = function () { * @inheritdoc */ ve.init.mw.CollabTarget.prototype.surfaceReady = function () { + var exportButton, + surfaceView = this.getSurface().getView(), + toolbar = this.getToolbar(); + // Parent method ve.init.mw.CollabTarget.super.prototype.surfaceReady.apply( this, arguments ); this.getSurface().getView().focus(); + + exportButton = new OO.ui.ButtonWidget( { + icon: 'wikiText', + label: ve.msg( 'visualeditor-savedialog-review-wikitext' ), + flags: [ 'progressive', 'primary' ] + } ); + exportButton.connect( this, { click: 'onExportButtonClick' } ); + + toolbar.$actions.append( exportButton.$element ); + toolbar.initialize(); + + surfaceView.focus(); +}; + +/** + * Handle click events from the export button + */ +ve.init.mw.CollabTarget.prototype.onExportButtonClick = function () { + var surface = this.getSurface(), + windowAction = ve.ui.actionFactory.create( 'window', surface ); + windowAction.open( 'mwExportWikitext', { surface: surface } ); }; /** diff --git a/modules/ve-mw-collab/ve.ui.MWExportWikitextDialog.js b/modules/ve-mw-collab/ve.ui.MWExportWikitextDialog.js new file mode 100644 index 0000000000..85eacdd5b7 --- /dev/null +++ b/modules/ve-mw-collab/ve.ui.MWExportWikitextDialog.js @@ -0,0 +1,97 @@ +/*! + * VisualEditor UserInterface MWExportWikitextDialog class. + * + * @copyright 2011-2017 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/** + * Dialog for exportWikitexting CollabTarget pages + * + * @class + * @extends OO.ui.ProcessDialog + * + * @constructor + * @param {Object} [config] Config options + */ +ve.ui.MWExportWikitextDialog = function VeUiMwExportWikitextDialog( config ) { + // Parent constructor + ve.ui.MWExportWikitextDialog.super.call( this, config ); + + // Initialization + this.$element.addClass( 've-ui-mwExportWikitextDialog' ); +}; + +/* Inheritance */ + +OO.inheritClass( ve.ui.MWExportWikitextDialog, OO.ui.ProcessDialog ); + +/* Static Properties */ + +ve.ui.MWExportWikitextDialog.static.name = 'mwExportWikitext'; + +ve.ui.MWExportWikitextDialog.static.title = ve.msg( 'visualeditor-savedialog-review-wikitext' ); + +ve.ui.MWExportWikitextDialog.static.actions = [ + { + label: OO.ui.deferMsg( 'visualeditor-dialog-action-done' ), + flags: 'safe' + } +]; + +ve.ui.MWExportWikitextDialog.static.size = 'larger'; + +/** + * @inheritdoc + */ +ve.ui.MWExportWikitextDialog.prototype.initialize = function () { + var panel; + // Parent method + ve.ui.MWExportWikitextDialog.super.prototype.initialize.call( this ); + + this.wikitext = new OO.ui.MultilineTextInputWidget( { + classes: [ 'mw-editfont-' + mw.user.options.get( 'editfont' ) ], + autosize: true, + readOnly: true, + rows: 20 + } ); + this.wikitext.$element.css( 'max-width', 'none' ); // Move to CSS + panel = new OO.ui.PanelLayout( { + padded: true, + expanded: false, + $content: this.wikitext.$element + } ); + this.$body.append( panel.$element ); +}; + +/** + * @inheritdoc + */ +ve.ui.MWExportWikitextDialog.prototype.getSetupProcess = function ( data ) { + return ve.ui.MWExportWikitextDialog.super.prototype.getSetupProcess.call( this, data ) + .next( function () { + var dialog = this; + this.wikitext.pushPending(); + // TODO: Handle API errors + ve.init.target.getWikitextFragment( data.surface.getModel().getDocument() ).then( function ( wikitext ) { + dialog.wikitext.setValue( wikitext.trim() ).select(); + dialog.wikitext.$input.scrollTop( 0 ); + dialog.wikitext.popPending(); + dialog.updateSize(); + } ); + }, this ); +}; + +/** + * @inheritdoc + */ +ve.ui.MWExportWikitextDialog.prototype.getTeardownProcess = function ( data ) { + return ve.ui.MWExportWikitextDialog.super.prototype.getTeardownProcess.call( this, data ) + .next( function () { + this.wikitext.setValue( '' ); + }, this ); +}; + +/* Registration */ + +ve.ui.windowFactory.register( ve.ui.MWExportWikitextDialog );