2021-05-17 15:43:49 +00:00
|
|
|
/*!
|
|
|
|
* VisualEditor user interface MWTransclusionOutlineContainerWidget class.
|
|
|
|
*
|
|
|
|
* @license The MIT License (MIT); see LICENSE.txt
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Container for transclusion, may contain a single or multiple templates.
|
|
|
|
*
|
|
|
|
* @class
|
|
|
|
* @extends OO.ui.Widget
|
|
|
|
*
|
|
|
|
* @constructor
|
2021-07-07 08:04:40 +00:00
|
|
|
* @param {Object} config
|
|
|
|
* @param {ve.dm.MWTransclusionModel} config.transclusionModel
|
2021-07-09 15:33:16 +00:00
|
|
|
* @property {Object.<string,ve.ui.MWTransclusionOutlinePartWidget>} partWidgets Map of top-level
|
|
|
|
* items currently visible in this container, indexed by part id
|
2021-05-17 15:43:49 +00:00
|
|
|
*/
|
|
|
|
ve.ui.MWTransclusionOutlineContainerWidget = function VeUiMWTransclusionOutlineContainerWidget( config ) {
|
|
|
|
// Parent constructor
|
|
|
|
ve.ui.MWTransclusionOutlineContainerWidget.super.call( this, config );
|
|
|
|
|
|
|
|
// Initialization
|
2021-06-17 11:20:50 +00:00
|
|
|
this.transclusionModel = config.transclusionModel;
|
2021-07-09 15:33:16 +00:00
|
|
|
this.partWidgets = {};
|
2021-06-17 11:20:50 +00:00
|
|
|
|
|
|
|
// Events
|
|
|
|
this.transclusionModel.connect( this, {
|
2021-07-13 07:27:22 +00:00
|
|
|
replace: 'onReplacePart',
|
|
|
|
change: 'onTransclusionModelChange'
|
2021-05-17 15:43:49 +00:00
|
|
|
} );
|
2021-07-13 07:07:59 +00:00
|
|
|
|
|
|
|
this.$element.addClass( 've-ui-mwTransclusionOutlineContainerWidget' );
|
2021-05-17 15:43:49 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Inheritance */
|
|
|
|
|
|
|
|
OO.inheritClass( ve.ui.MWTransclusionOutlineContainerWidget, OO.ui.Widget );
|
2021-06-17 11:20:50 +00:00
|
|
|
|
|
|
|
/* Events */
|
|
|
|
|
|
|
|
/**
|
2021-07-07 08:04:40 +00:00
|
|
|
* @private
|
|
|
|
* @param {ve.dm.MWTransclusionPartModel|null} removed Removed part
|
|
|
|
* @param {ve.dm.MWTransclusionPartModel|null} added Added part
|
2021-06-17 11:20:50 +00:00
|
|
|
*/
|
|
|
|
ve.ui.MWTransclusionOutlineContainerWidget.prototype.onReplacePart = function ( removed, added ) {
|
2021-07-09 15:33:16 +00:00
|
|
|
if ( removed ) {
|
|
|
|
this.removePartWidget( removed );
|
2021-06-17 11:20:50 +00:00
|
|
|
}
|
|
|
|
// TODO: reselect if active part was in a removed template
|
|
|
|
|
2021-07-09 15:33:16 +00:00
|
|
|
if ( added ) {
|
|
|
|
this.addPartWidget( added );
|
2021-06-17 11:20:50 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-07-13 07:27:22 +00:00
|
|
|
/**
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
ve.ui.MWTransclusionOutlineContainerWidget.prototype.onTransclusionModelChange = function () {
|
|
|
|
var newOrder = this.transclusionModel.getParts();
|
|
|
|
|
|
|
|
for ( var i = 0; i < newOrder.length; i++ ) {
|
|
|
|
var expectedWidget = this.partWidgets[ newOrder[ i ].getId() ],
|
|
|
|
$expectedElement = expectedWidget && expectedWidget.$element,
|
|
|
|
$currentElement = this.$element.children().eq( i );
|
|
|
|
|
|
|
|
if ( !$currentElement.is( $expectedElement ) ) {
|
|
|
|
// Move each widget to the correct position if it wasn't there before
|
|
|
|
$currentElement.before( $expectedElement );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-06-17 11:20:50 +00:00
|
|
|
/* Methods */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @private
|
2021-07-09 15:33:16 +00:00
|
|
|
* @param {ve.dm.MWTransclusionPartModel} part
|
2021-06-17 11:20:50 +00:00
|
|
|
*/
|
2021-07-09 15:33:16 +00:00
|
|
|
ve.ui.MWTransclusionOutlineContainerWidget.prototype.removePartWidget = function ( part ) {
|
|
|
|
var partId = part.getId(),
|
|
|
|
widget = this.partWidgets[ partId ];
|
2021-06-17 11:20:50 +00:00
|
|
|
|
2021-07-09 15:33:16 +00:00
|
|
|
if ( widget ) {
|
|
|
|
widget.$element.remove();
|
|
|
|
delete this.partWidgets[ partId ];
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @private
|
|
|
|
* @param {ve.dm.MWTransclusionPartModel} part
|
|
|
|
*/
|
|
|
|
ve.ui.MWTransclusionOutlineContainerWidget.prototype.addPartWidget = function ( part ) {
|
|
|
|
var widget;
|
|
|
|
|
|
|
|
if ( part instanceof ve.dm.MWTemplateModel ) {
|
|
|
|
widget = new ve.ui.MWTransclusionOutlineTemplateWidget( part );
|
|
|
|
} else if ( part instanceof ve.dm.MWTemplatePlaceholderModel ) {
|
|
|
|
widget = new ve.ui.MWTransclusionOutlinePlaceholderWidget( part );
|
|
|
|
} else if ( part instanceof ve.dm.MWTransclusionContentModel ) {
|
|
|
|
widget = new ve.ui.MWTransclusionOutlineWikitextWidget( part );
|
|
|
|
}
|
|
|
|
|
|
|
|
this.partWidgets[ part.getId() ] = widget;
|
|
|
|
// FIXME: Respect order
|
|
|
|
this.$element.append( widget.$element );
|
2021-06-17 11:20:50 +00:00
|
|
|
};
|