mediawiki-extensions-Cite/modules/ve-cite/ve.ui.MWReferencesListDialog.js
David Lynch d54fbf287d MWReferencesList: drop autoGenerated attribute if changed
If the user has moved the reflist away from the end of the document, or
changed any properties on it, it shouldn't be treated as autoGenerated any
more.

Bug: T153754
Change-Id: I348601952dbfcf06bfb564e4db9cac820f3b2776
2017-11-07 11:56:08 -06:00

169 lines
4.9 KiB
JavaScript

/*!
* VisualEditor user interface MWReferencesListDialog class.
*
* @copyright 2011-2017 Cite VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* Dialog for editing MediaWiki references lists.
*
* @class
* @extends ve.ui.NodeDialog
*
* @constructor
* @param {Object} [config] Configuration options
*/
ve.ui.MWReferencesListDialog = function VeUiMWReferencesListDialog( config ) {
// Parent constructor
ve.ui.MWReferencesListDialog.super.call( this, config );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWReferencesListDialog, ve.ui.NodeDialog );
/* Static Properties */
ve.ui.MWReferencesListDialog.static.name = 'referencesList';
ve.ui.MWReferencesListDialog.static.title =
OO.ui.deferMsg( 'cite-ve-dialog-referenceslist-title' );
ve.ui.MWReferencesListDialog.static.modelClasses = [ ve.dm.MWReferencesListNode ];
ve.ui.MWReferencesListDialog.static.size = 'medium';
ve.ui.MWReferencesListDialog.static.actions = [
{
action: 'apply',
label: OO.ui.deferMsg( 'visualeditor-dialog-action-apply' ),
flags: [ 'progressive', 'primary' ],
modes: 'edit'
},
{
label: OO.ui.deferMsg( 'visualeditor-dialog-action-cancel' ),
flags: [ 'safe', 'back' ],
modes: 'edit'
}
];
/* Methods */
/**
* @inheritdoc
*/
ve.ui.MWReferencesListDialog.prototype.getBodyHeight = function () {
return Math.max( 150, Math.ceil( this.editPanel.$element[ 0 ].scrollHeight ) );
};
/**
* @inheritdoc
*/
ve.ui.MWReferencesListDialog.prototype.initialize = function () {
var groupField, responsiveField;
// Parent method
ve.ui.MWReferencesListDialog.super.prototype.initialize.call( this );
// Properties
this.panels = new OO.ui.StackLayout();
this.editPanel = new OO.ui.PanelLayout( {
scrollable: true, padded: true
} );
this.optionsFieldset = new OO.ui.FieldsetLayout();
this.groupInput = new ve.ui.MWReferenceGroupInputWidget( {
$overlay: this.$overlay,
emptyGroupName: ve.msg( 'cite-ve-dialog-reference-options-group-placeholder' )
} );
groupField = new OO.ui.FieldLayout( this.groupInput, {
align: 'top',
label: ve.msg( 'cite-ve-dialog-reference-options-group-label' )
} );
this.responsiveCheckbox = new OO.ui.CheckboxInputWidget();
responsiveField = new OO.ui.FieldLayout( this.responsiveCheckbox, {
align: 'inline',
label: ve.msg( 'cite-ve-dialog-reference-options-responsive-label' )
} );
// Initialization
this.optionsFieldset.addItems( [ groupField, responsiveField ] );
this.editPanel.$element.append( this.optionsFieldset.$element );
this.panels.addItems( [ this.editPanel ] );
this.$body.append( this.panels.$element );
};
/**
* @inheritdoc
*/
ve.ui.MWReferencesListDialog.prototype.getActionProcess = function ( action ) {
if ( action === 'apply' ) {
return new OO.ui.Process( function () {
var refGroup, listGroup, oldListGroup, isResponsive, oldResponsive, mwData, attrChanges, doc,
surfaceModel = this.getFragment().getSurface();
// Save changes
refGroup = this.groupInput.getValue();
listGroup = 'mwReference/' + refGroup;
isResponsive = this.responsiveCheckbox.isSelected();
if ( this.selectedNode ) {
// Edit existing model
doc = surfaceModel.getDocument();
oldListGroup = this.selectedNode.getAttribute( 'listGroup' );
oldResponsive = this.selectedNode.getAttribute( 'isResponsive' );
if ( listGroup !== oldListGroup || isResponsive !== oldResponsive ) {
// newFromAttributeChanges doesn't do the smart-replacing
// for nested attributes, so make a copy of the mw
// attribute so we can disable autoGenerated now we've
// changed it.
mwData = ve.copy( this.selectedNode.getAttribute( 'mw' ) ) || {};
delete mwData.autoGenerated;
attrChanges = {
listGroup: listGroup,
refGroup: refGroup,
isResponsive: isResponsive,
mw: mwData
};
surfaceModel.change(
ve.dm.TransactionBuilder.static.newFromAttributeChanges(
doc, this.selectedNode.getOuterRange().start, attrChanges
)
);
}
}
this.close( { action: action } );
}, this );
}
// Parent method
return ve.ui.MWReferencesListDialog.super.prototype.getActionProcess.call( this, action );
};
/**
* @inheritdoc
*/
ve.ui.MWReferencesListDialog.prototype.getSetupProcess = function ( data ) {
return ve.ui.MWReferencesListDialog.super.prototype.getSetupProcess.call( this, data )
.next( function () {
if ( !( this.selectedNode instanceof ve.dm.MWReferencesListNode ) ) {
throw new Error( 'Cannot open dialog: references list must be selected' );
}
this.actions.setMode( 'edit' );
this.groupInput.setValue( this.selectedNode.getAttribute( 'refGroup' ) );
this.groupInput.populateMenu( this.getFragment().getDocument().getInternalList() );
this.responsiveCheckbox.setSelected( this.selectedNode.getAttribute( 'isResponsive' ) );
}, this );
};
/* Registration */
ve.ui.windowFactory.register( ve.ui.MWReferencesListDialog );