mediawiki-extensions-Visual.../modules/ve-mw/ui/dialogs/ve.ui.MWReferenceListDialog.js
Roan Kattouw 96000558a2 Don't select nodes inserted by a dialog, but drop cursor after
It used to be that when you closed a dialog, the thing that the dialog
inspected or inserted would be selected. For insertions, the selection
will now be collapsed immediately after the inserted node.
For modifications, the original behavior was kept, as it makes sense to
keep selecting the node that the user had to select in order to access
the dialog. For removals (only possible in the transclusion dialog),
the selection ends up as a collapsed selection at the location where
the removed node used to be; this was already behaving correctly,
as we get this behavior for free with offset translation.

Bug: 54957
Change-Id: Ibd14e8084d67a9ee85e3bac075c3fb50f27b05b2
2013-12-09 18:02:18 -08:00

163 lines
4 KiB
JavaScript

/*!
* VisualEditor user interface MWReferenceListDialog class.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* Dialog for inserting and editing MediaWiki reference lists.
*
* @class
* @extends ve.ui.MWDialog
*
* @constructor
* @param {ve.ui.WindowSet} windowSet Window set this dialog is part of
* @param {Object} [config] Configuration options
*/
ve.ui.MWReferenceListDialog = function VeUiMWReferenceListDialog( windowSet, config ) {
// Parent constructor
ve.ui.MWDialog.call( this, windowSet, config );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWReferenceListDialog, ve.ui.MWDialog );
/* Static Properties */
ve.ui.MWReferenceListDialog.static.name = 'referenceList';
ve.ui.MWReferenceListDialog.static.titleMessage = 'visualeditor-dialog-referencelist-title';
ve.ui.MWReferenceListDialog.static.icon = 'references';
/* Methods */
/**
* @inheritdoc
*/
ve.ui.MWReferenceListDialog.prototype.initialize = function () {
// Parent method
ve.ui.MWDialog.prototype.initialize.call( this );
// Properties
this.editPanel = new OO.ui.PanelLayout( {
'$': this.$, 'scrollable': true, 'padded': true
} );
this.optionsFieldset = new OO.ui.FieldsetLayout( {
'$': this.$,
'label': ve.msg( 'visualeditor-dialog-reference-options-section' ),
'icon': 'settings'
} );
this.groupInput = new OO.ui.TextInputWidget( { '$': this.$ } );
this.groupLabel = new OO.ui.InputLabelWidget( {
'$': this.$,
'input': this.groupInput,
'label': ve.msg( 'visualeditor-dialog-reference-options-group-label' )
} );
this.applyButton = new OO.ui.PushButtonWidget( {
'$': this.$,
'label': ve.msg( 'visualeditor-dialog-action-apply' ),
'flags': ['primary']
} );
// Events
this.applyButton.connect( this, { 'click': [ 'close', { 'action': 'apply' } ] } );
// Initialization
this.optionsFieldset.$element.append( this.groupLabel.$element, this.groupInput.$element );
this.editPanel.$element.append( this.optionsFieldset.$element );
this.$body.append( this.editPanel.$element );
this.$foot.append( this.applyButton.$element );
};
/**
* @inheritdoc
*/
ve.ui.MWReferenceListDialog.prototype.setup = function ( data ) {
// Parent method
ve.ui.MWDialog.prototype.setup.call( this, data );
var node, refGroup;
// Prepopulate from existing node if we're editing a node
// instead of inserting a new one
node = this.surface.getView().getFocusedNode();
if ( node instanceof ve.ce.MWReferenceListNode ) {
refGroup = node.getModel().getAttribute( 'refGroup' );
} else {
refGroup = '';
}
this.groupInput.setValue( refGroup );
/**
* Focused node.
*
* @private
* @property {ve.ce.MWReferenceListNode|undefined}
*/
this.node = node;
};
/**
* @inheritdoc
*/
ve.ui.MWReferenceListDialog.prototype.teardown = function ( data ) {
var refGroup, listGroup, oldListGroup, attrChanges,
doc, model,
surfaceModel = this.surface.getModel(),
node = this.node;
// Data initialization
data = data || {};
// Save changes
if ( data.action === 'apply' ) {
refGroup = this.groupInput.getValue();
listGroup = 'mwReference/' + refGroup;
if ( node ) {
// Edit existing model
doc = surfaceModel.getDocument();
model = node.getModel();
oldListGroup = model.getAttribute( 'listGroup' );
if ( listGroup !== oldListGroup ) {
attrChanges = {
listGroup: listGroup,
refGroup: refGroup
};
surfaceModel.change(
ve.dm.Transaction.newFromAttributeChanges(
doc, model.getOuterRange().start, attrChanges
)
);
}
} else {
// Create new model
surfaceModel.getFragment().collapseRangeToEnd().insertContent( [
{
'type': 'mwReferenceList',
'attributes': {
'listGroup': listGroup,
'refGroup': refGroup
}
},
{ 'type': '/mwReferenceList' }
] ).collapseRangeToEnd().select();
}
}
// Parent method
ve.ui.MWDialog.prototype.teardown.call( this, data );
};
/* Registration */
ve.ui.dialogFactory.register( ve.ui.MWReferenceListDialog );