/*! * VisualEditor UserInterface MWSaveDialogAction class. * * @copyright See AUTHORS.txt */ // TODO: Can perhaps extract a lot of the dialog lifecycle management code // from ArticleTarget and put it here. /** * Save action. * * @class * @extends ve.ui.Action * * @constructor * @param {ve.ui.Surface} surface Surface to act on */ ve.ui.MWSaveDialogAction = function VeUiMWSaveDialogAction() { // Parent constructor ve.ui.MWSaveDialogAction.super.apply( this, arguments ); }; /* Inheritance */ OO.inheritClass( ve.ui.MWSaveDialogAction, ve.ui.Action ); /* Static Properties */ ve.ui.MWSaveDialogAction.static.name = 'mwSaveDialog'; ve.ui.MWSaveDialogAction.static.methods = [ 'save', 'review', 'preview' ]; /* Methods */ /** * Open the save dialog * * @param {string} checkbox Checkbox to toggle after opening * @return {boolean} Action was executed */ ve.ui.MWSaveDialogAction.prototype.save = function ( checkbox ) { ve.init.target.showSaveDialog( null, checkbox ); return true; }; /** * Open the save dialog, and set it to the review panel * * @return {boolean} Action was executed */ ve.ui.MWSaveDialogAction.prototype.review = function () { ve.init.target.showSaveDialog( 'review' ); return true; }; /** * Open the save dialog, and set it to the preview panel * * @return {boolean} Action was executed */ ve.ui.MWSaveDialogAction.prototype.preview = function () { ve.init.target.showSaveDialog( 'preview' ); return true; }; /* Registration */ ve.ui.actionFactory.register( ve.ui.MWSaveDialogAction ); /* Commands */ /** * Command which can only execute when the document is saveable * * @class * @extends ve.ui.Command * * @constructor */ ve.ui.MWSaveCommand = function VeUiMwSaveCommand() { // Parent constructor ve.ui.MWSaveCommand.super.apply( this, arguments ); }; OO.inheritClass( ve.ui.MWSaveCommand, ve.ui.Command ); /** * @inheritdoc ve.ui.Command */ ve.ui.MWSaveCommand.prototype.isExecutable = function () { // Parent method return ve.ui.MWSaveCommand.super.prototype.isExecutable.apply( this, arguments ) && ve.init.target.isSaveable(); }; ve.ui.commandRegistry.register( new ve.ui.MWSaveCommand( 'showSave', 'mwSaveDialog', 'save' ) ); ve.ui.commandRegistry.register( new ve.ui.MWSaveCommand( 'showChanges', 'mwSaveDialog', 'review' ) ); if ( mw.libs.ve.isWikitextAvailable ) { // Ensure wikitextCommandRegistry has finished loading mw.loader.using( 'ext.visualEditor.mwwikitext' ).then( () => { ve.ui.wikitextCommandRegistry.register( new ve.ui.MWSaveCommand( 'showPreview', 'mwSaveDialog', 'preview' ) ); } ); } ve.ui.commandRegistry.register( new ve.ui.MWSaveCommand( 'saveMinoredit', 'mwSaveDialog', 'save', { args: [ 'wpMinoredit' ] } ) ); ve.ui.commandRegistry.register( new ve.ui.MWSaveCommand( 'saveWatchthis', 'mwSaveDialog', 'save', { args: [ 'wpWatchthis' ] } ) ); /* Triggers & command help */ ( function () { const accessKeyPrefix = $.fn.updateTooltipAccessKeys.getAccessKeyPrefix().replace( /-/g, '+' ), shortcuts = [ { command: 'showSave', accessKey: 'accesskey-save', label: function () { return ve.init.target.getSaveButtonLabel(); } }, { command: 'showChanges', accessKey: 'accesskey-diff', label: OO.ui.deferMsg( 'visualeditor-savedialog-label-review' ) }, { command: 'showPreview', accessKey: 'accesskey-preview', label: OO.ui.deferMsg( 'showpreview' ) }, { command: 'saveMinoredit', accessKey: 'accesskey-minoredit', label: OO.ui.deferMsg( 'tooltip-minoredit' ) }, { command: 'saveWatchthis', accessKey: 'accesskey-watch', label: OO.ui.deferMsg( 'tooltip-watch' ) } ]; shortcuts.forEach( ( shortcut ) => { // The following messages can be used here: // * accesskey-save // * accesskey-diff // * accesskey-preview // * accesskey-minoredit // * accesskey-watch const accessKey = ve.msg( shortcut.accessKey ); if ( accessKey !== '-' && accessKey !== '' ) { try { ve.ui.triggerRegistry.register( shortcut.command, new ve.ui.Trigger( accessKeyPrefix + accessKey ) ); } catch ( e ) { mw.log.warn( 'Invalid accesskey data? Failed to register ' + accessKeyPrefix + accessKey ); return; } ve.ui.commandHelpRegistry.register( 'other', shortcut.command, { trigger: shortcut.command, label: shortcut.label } ); ve.ui.MWCommandHelpDialog.static.commandGroups.other.demote = ve.ui.MWCommandHelpDialog.static.commandGroups.other.demote || []; ve.ui.MWCommandHelpDialog.static.commandGroups.other.demote.push( shortcut.command ); } } ); }() );