mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-09-26 19:56:49 +00:00
3f2a885e3e
Applying staging doesn't emit an update event on the node, so forcefully emit one with 'staged' equal to false, so the full error is rendered (if present). Logically depends on I8ebb26d4bc in core. Bug: T114480 Change-Id: I7ba54b67982fc5b10839426cdc216e14c0e33c01
107 lines
3.1 KiB
JavaScript
107 lines
3.1 KiB
JavaScript
/*!
|
|
* VisualEditor UserInterface MWLiveExtensionInspector class.
|
|
*
|
|
* @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
|
|
* @license The MIT License (MIT); see LICENSE.txt
|
|
*/
|
|
|
|
/**
|
|
* Inspector for editing generic MediaWiki extensions with dynamic rendering.
|
|
*
|
|
* @class
|
|
* @abstract
|
|
* @extends ve.ui.MWExtensionInspector
|
|
*
|
|
* @constructor
|
|
* @param {Object} [config] Configuration options
|
|
*/
|
|
ve.ui.MWLiveExtensionInspector = function VeUiMWLiveExtensionInspector() {
|
|
// Parent constructor
|
|
ve.ui.MWLiveExtensionInspector.super.apply( this, arguments );
|
|
|
|
// Late bind onChangeHandler to a debounced updatePreview
|
|
this.onChangeHandler = ve.debounce( this.updatePreview.bind( this ), 250 );
|
|
};
|
|
|
|
/* Inheritance */
|
|
|
|
OO.inheritClass( ve.ui.MWLiveExtensionInspector, ve.ui.MWExtensionInspector );
|
|
|
|
/* Methods */
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
ve.ui.MWLiveExtensionInspector.prototype.getSetupProcess = function ( data ) {
|
|
return ve.ui.MWLiveExtensionInspector.super.prototype.getSetupProcess.call( this, data )
|
|
.next( function () {
|
|
var element = this.getNewElement();
|
|
// Initialization
|
|
this.getFragment().getSurface().pushStaging();
|
|
|
|
if ( !this.selectedNode ) {
|
|
// Create a new node
|
|
// collapseToEnd returns a new fragment
|
|
this.fragment = this.getFragment().collapseToEnd().insertContent( [
|
|
element,
|
|
{ type: '/' + element.type }
|
|
] );
|
|
// Check if the node was inserted at a structural offset and wrapped in a paragraph
|
|
if ( this.getFragment().getSelection().getRange().getLength() === 4 ) {
|
|
this.fragment = this.getFragment().adjustLinearSelection( 1, -1 );
|
|
}
|
|
this.getFragment().select();
|
|
this.selectedNode = this.getFragment().getSelectedNode();
|
|
}
|
|
this.input.on( 'change', this.onChangeHandler );
|
|
}, this );
|
|
};
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
ve.ui.MWLiveExtensionInspector.prototype.getTeardownProcess = function ( data ) {
|
|
return ve.ui.MWLiveExtensionInspector.super.prototype.getTeardownProcess.call( this, data )
|
|
.first( function () {
|
|
this.input.off( 'change', this.onChangeHandler );
|
|
if ( data === undefined ) { // cancel
|
|
this.getFragment().getSurface().popStaging();
|
|
}
|
|
}, this );
|
|
};
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
ve.ui.MWLiveExtensionInspector.prototype.insertOrUpdateNode = function () {
|
|
// No need to call parent method as changes have already been made
|
|
// to the model in staging, just need to apply them.
|
|
this.updatePreview();
|
|
this.getFragment().getSurface().applyStaging();
|
|
// Force the selected node to re-render after staging has finished
|
|
this.selectedNode.emit( 'update', false );
|
|
};
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
ve.ui.MWLiveExtensionInspector.prototype.removeNode = function () {
|
|
this.getFragment().getSurface().popStaging();
|
|
|
|
// Parent method
|
|
ve.ui.MWLiveExtensionInspector.super.prototype.removeNode.call( this );
|
|
};
|
|
|
|
/**
|
|
* Update the node rendering to reflect the current content in the inspector.
|
|
*/
|
|
ve.ui.MWLiveExtensionInspector.prototype.updatePreview = function () {
|
|
var mwData = ve.copy( this.selectedNode.getAttribute( 'mw' ) );
|
|
|
|
this.updateMwData( mwData );
|
|
|
|
if ( this.visible ) {
|
|
this.getFragment().changeAttributes( { mw: mwData } );
|
|
}
|
|
};
|