Merge "Offer to retain changes when switching to the wikitext editor"

This commit is contained in:
jenkins-bot 2014-06-30 23:40:30 +00:00 committed by Gerrit Code Review
commit 87663c99e0
5 changed files with 132 additions and 19 deletions

View file

@ -660,6 +660,7 @@ $wgResourceModules += array(
'modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js',
'modules/ve-mw/ui/dialogs/ve.ui.MWBetaWelcomeDialog.js',
'modules/ve-mw/ui/dialogs/ve.ui.MWCommandHelpDialog.js',
'modules/ve-mw/ui/dialogs/ve.ui.MWWikitextSwitchConfirmDialog.js',
'modules/ve-mw/ui/tools/ve.ui.MWEditModeTool.js',
'modules/ve-mw/ui/tools/ve.ui.MWPopupTool.js',
@ -707,6 +708,7 @@ $wgResourceModules += array(
'visualeditor-mweditmodesource-title',
'visualeditor-mweditmodesource-warning',
'visualeditor-mweditmodesource-warning-switch',
'visualeditor-mweditmodesource-warning-switch-discard',
'visualeditor-mweditmodesource-warning-cancel',
'visualeditor-pagemenu-tooltip',
'visualeditor-pagetranslationwarning',

View file

@ -184,9 +184,10 @@
"visualeditor-meta-tool": "Options",
"visualeditor-mwalienextensioninspector-title": "MediaWiki extension",
"visualeditor-mweditmodesource-title": "Switch to source editing",
"visualeditor-mweditmodesource-warning": "You are about to switch to source editing.\nAny changes you've made to this document will be kept, but you will not be able switch back to VisualEditor without saving or reloading the page.\nDo you want to continue?",
"visualeditor-mweditmodesource-warning-switch": "Yes, switch",
"visualeditor-mweditmodesource-warning-cancel": "No, cancel",
"visualeditor-mweditmodesource-warning": "You are about to switch to source editing.\nAny changes you've made to this document can be kept, but you will not be able switch back to VisualEditor without saving or reloading the page.\nDo you want to continue?",
"visualeditor-mweditmodesource-warning-switch": "Keep changes",
"visualeditor-mweditmodesource-warning-switch-discard": "Discard changes",
"visualeditor-mweditmodesource-warning-cancel": "Cancel",
"visualeditor-mwgalleryinspector-placeholder": "Example.jpg|Caption for image",
"visualeditor-mwgalleryinspector-title": "Gallery",
"visualeditor-pagemenu-tooltip": "Page options",

View file

@ -190,7 +190,8 @@
"visualeditor-mwalienextensioninspector-title": "Used as title for unknown MediaWiki extensions.\n{{Identical|MediaWiki extension}}",
"visualeditor-mweditmodesource-title": "Label for changing edit mode to source editing.",
"visualeditor-mweditmodesource-warning": "Warning message show before changing edit mode to source editing.",
"visualeditor-mweditmodesource-warning-switch": "Label for the OK button on the confirmation dialog for switching to source editing.",
"visualeditor-mweditmodesource-warning-switch": "Label for the keep changes button on the confirmation dialog for switching to source editing.",
"visualeditor-mweditmodesource-warning-switch-discard": "Label for the discard changes button on the confirmation dialog for switching to source editing.",
"visualeditor-mweditmodesource-warning-cancel": "Label for the cancel button on the confirmation dialog for switching to source editing.",
"visualeditor-mwgalleryinspector-placeholder": "Placeholder text for the gallery inspector demonstrating how gallery syntax works.",
"visualeditor-mwgalleryinspector-title": "Used as title for the gallery inspector.\n{{Identical|Gallery}}",

View file

@ -892,25 +892,34 @@ ve.init.mw.ViewPageTarget.prototype.saveDocument = function ( saveDeferred ) {
* @method
*/
ve.init.mw.ViewPageTarget.prototype.editSource = function () {
var confirmDialog = this.surface.dialogs.getWindow( 'confirm' ),
$documentNode = this.surface.getView().getDocument().getDocumentNode().$element,
var $documentNode = this.surface.getView().getDocument().getDocumentNode().$element,
target = this;
$documentNode.css( 'opacity', 0.5 );
confirmDialog.open( {
'prompt': ve.msg( 'visualeditor-mweditmodesource-warning' ),
'okLabel': ve.msg( 'visualeditor-mweditmodesource-warning-switch' ),
'okFlags': [ 'primary' ],
'cancelLabel': ve.msg( 'visualeditor-mweditmodesource-warning-cancel' ),
'cancelFlags': []
} ).then( function ( closingPromise ) {
closingPromise.then( function () {
// Get Wikitext from the DOM
target.serialize(
target.docToSave || ve.dm.converter.getDomFromModel( target.surface.getModel().getDocument() ),
ve.bind( target.submitWithSaveFields, target, { 'wpDiff': 1, 'veswitched': 1 } )
);
this.surface.dialogs.getWindow( 'wikitextswitchconfirm' ).open().then( function ( closingPromise ) {
closingPromise.then( function ( result ) {
if ( result.action === 'switch' ) {
// Get Wikitext from the DOM
target.serialize(
target.docToSave || ve.dm.converter.getDomFromModel( target.surface.getModel().getDocument() ),
ve.bind( target.submitWithSaveFields, target, { 'wpDiff': 1, 'veswitched': 1 } )
);
} else if ( result.action === 'discard' ) {
target.submitting = true;
$( '<form method="get" style="display: none;"></form>' ).append(
$( '<input>' ).attr( {
'name': 'action',
'value': 'edit',
'type': 'hidden'
} ),
$( '<input>' ).attr( {
'name': 'veswitched',
'value': 1,
'type': 'hidden'
} )
).appendTo( 'body' ).submit();
}
}, function () {
// Undo the opacity change
$documentNode.css( 'opacity', 1 );
@ -1081,10 +1090,16 @@ ve.init.mw.ViewPageTarget.prototype.tearDownSurface = function () {
* @method
*/
ve.init.mw.ViewPageTarget.prototype.setupSkinTabs = function () {
var viewPageTarget = this;
if ( this.isViewPage ) {
// Allow instant switching back to view mode, without refresh
$( '#ca-view a, #ca-nstab-visualeditor a' )
.click( ve.bind( this.onViewTabClick, this ) );
$( '#ca-viewsource, #ca-edit' ).click( function ( e ) {
viewPageTarget.editSource();
e.preventDefault();
} );
}
mw.hook( 've.skinTabSetupComplete' ).fire();

View file

@ -0,0 +1,94 @@
/**
* Dialog for showing a confirmation/warning message.
*
* @class
* @extends ve.ui.Dialog
*
* @constructor
* @param {Object} [config] Configuration options
*/
ve.ui.MWWikitextSwitchConfirmDialog = function VeUiMWWikitextSwitchConfirmDialog( config ) {
// Configuration initialization
config = $.extend( { 'size': 'small' }, config );
// Parent constructor
ve.ui.MWWikitextSwitchConfirmDialog.super.call( this, config );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWWikitextSwitchConfirmDialog, OO.ui.Dialog );
/* Static Properties */
ve.ui.MWWikitextSwitchConfirmDialog.static.name = 'wikitextswitchconfirm';
ve.ui.MWWikitextSwitchConfirmDialog.static.icon = 'help';
ve.ui.MWWikitextSwitchConfirmDialog.static.title = OO.ui.deferMsg( 'ooui-dialog-confirm-title' );
/* Methods */
/**
* @inheritdoc
*/
ve.ui.MWWikitextSwitchConfirmDialog.prototype.initialize = function () {
// Parent method
ve.ui.MWWikitextSwitchConfirmDialog.super.prototype.initialize.call( this );
// Set up the layout
var contentLayout = new OO.ui.PanelLayout( {
'$': this.$,
'padded': true
} );
this.$promptContainer = this.$( '<div>' )
.addClass( 'oo-ui-dialog-confirm-promptContainer' )
.text( ve.msg( 'visualeditor-mweditmodesource-warning' ) );
this.cancelButton = new OO.ui.ButtonWidget( {
'label': ve.msg( 'visualeditor-mweditmodesource-warning-cancel' )
} );
this.cancelButton.connect( this, { 'click': [ 'close', { 'action': 'cancel' } ] } );
this.keepChangesButton = new OO.ui.ButtonWidget( {
'flags': 'primary',
'label': ve.msg( 'visualeditor-mweditmodesource-warning-switch' )
} );
this.keepChangesButton.connect( this, { 'click': [ 'close', { 'action': 'switch' } ] } );
this.forgetChangesButton = new OO.ui.ButtonWidget( {
'flags': 'destructive',
'label': ve.msg( 'visualeditor-mweditmodesource-warning-switch-discard' )
} );
this.forgetChangesButton.connect( this, { 'click': [ 'close', { 'action': 'discard' } ] } );
// Make the buttons
contentLayout.$element.append( this.$promptContainer );
this.$body.append( contentLayout.$element );
this.$foot.append(
this.keepChangesButton.$element,
this.forgetChangesButton.$element,
this.cancelButton.$element
);
};
/**
* @inheritdoc
*/
ve.ui.MWWikitextSwitchConfirmDialog.prototype.getTeardownProcess = function ( data ) {
// Parent method
return ve.ui.MWWikitextSwitchConfirmDialog.super.prototype.getTeardownProcess.call( this, data )
.first( function () {
if ( data.action === 'switch' || data.action === 'discard' ) {
this.opened.resolve( data );
} else {
this.opened.reject();
}
}, this );
};
/* Registration */
ve.ui.windowFactory.register( ve.ui.MWWikitextSwitchConfirmDialog );