mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-12-30 06:53:20 +00:00
fd669a4d16
This sorting algorithm was introduced via Ic6bc348 (T274544). Note there is no index parameter in the .onReplacePart() handler at this point. When a part was moved, it was removed and simply appended to the end. The additional sorting was needed to move it back to the correct position. This changed a few days later via Iafe29f1. There is now an index parameter. The .onReplacePart() handler does the same as before, but puts the part at the correct position right away. The additional sorting is pointless since then. The removed code alone is responsible for 1/3 of the total blocking time when the template dialog opens. Bug: T296335 Change-Id: I6c3fa70b532d34cd29d59c3b48ab81ebf608d548
91 lines
3.5 KiB
JavaScript
91 lines
3.5 KiB
JavaScript
QUnit.module( 've.ui.MWTransclusionOutlineWidget' );
|
|
|
|
QUnit.test( 'Constructor', ( assert ) => {
|
|
const widget = new ve.ui.MWTransclusionOutlineWidget();
|
|
|
|
// eslint-disable-next-line no-jquery/no-class-state
|
|
assert.true( widget.$element.hasClass( 've-ui-mwTransclusionOutlineWidget' ) );
|
|
assert.deepEqual( widget.partWidgets, {} );
|
|
} );
|
|
|
|
QUnit.test( 'Supports all ve.dm.MWTransclusionPartModel subclasses', ( assert ) => {
|
|
const transclusion = new ve.dm.MWTransclusionModel(),
|
|
widget = new ve.ui.MWTransclusionOutlineWidget();
|
|
|
|
widget.onReplacePart( null, new ve.dm.MWTemplateModel( transclusion, { wt: '' } ) );
|
|
widget.onReplacePart( null, new ve.dm.MWTemplatePlaceholderModel( transclusion ) );
|
|
widget.onReplacePart( null, new ve.dm.MWTransclusionContentModel( transclusion ) );
|
|
|
|
assert.true( widget.partWidgets.part_0 instanceof ve.ui.MWTransclusionOutlineTemplateWidget );
|
|
assert.true( widget.partWidgets.part_1 instanceof ve.ui.MWTransclusionOutlinePlaceholderWidget );
|
|
assert.true( widget.partWidgets.part_2 instanceof ve.ui.MWTransclusionOutlineWikitextWidget );
|
|
} );
|
|
|
|
QUnit.test( 'Basic functionality', ( assert ) => {
|
|
const transclusion = new ve.dm.MWTransclusionModel(),
|
|
part0 = new ve.dm.MWTransclusionContentModel( transclusion ),
|
|
part1 = new ve.dm.MWTransclusionContentModel( transclusion ),
|
|
widget = new ve.ui.MWTransclusionOutlineWidget();
|
|
|
|
widget.onReplacePart();
|
|
assert.deepEqual( widget.partWidgets, {} );
|
|
|
|
widget.onReplacePart( null, part0 );
|
|
widget.onReplacePart( null, part1 );
|
|
assert.deepEqual( Object.keys( widget.partWidgets ), [ 'part_0', 'part_1' ] );
|
|
|
|
widget.onReplacePart( part0 );
|
|
assert.deepEqual( Object.keys( widget.partWidgets ), [ 'part_1' ] );
|
|
|
|
widget.clear();
|
|
assert.deepEqual( widget.partWidgets, {} );
|
|
} );
|
|
|
|
QUnit.test( 'Adding and moving parts to specific positions', ( assert ) => {
|
|
const transclusion = new ve.dm.MWTransclusionModel(),
|
|
part0 = new ve.dm.MWTransclusionContentModel( transclusion ),
|
|
part1 = new ve.dm.MWTransclusionContentModel( transclusion ),
|
|
part2 = new ve.dm.MWTransclusionContentModel( transclusion ),
|
|
widget = new ve.ui.MWTransclusionOutlineWidget();
|
|
|
|
// This adds the parts at an invalid position, at the start, and in the middle
|
|
widget.onReplacePart( null, part0, 666 );
|
|
widget.onReplacePart( null, part1, 0 );
|
|
widget.onReplacePart( null, part2, 1 );
|
|
|
|
// Note this is just a map and doesn't reflect the order in the UI
|
|
assert.deepEqual( Object.keys( widget.partWidgets ), [ 'part_0', 'part_1', 'part_2' ] );
|
|
|
|
const $items = widget.$element.children();
|
|
assert.true( $items.eq( 0 ).is( widget.partWidgets.part_1.$element ) );
|
|
assert.true( $items.eq( 1 ).is( widget.partWidgets.part_2.$element ) );
|
|
assert.true( $items.eq( 2 ).is( widget.partWidgets.part_0.$element ) );
|
|
} );
|
|
|
|
[
|
|
[ '', null ],
|
|
[ 'part_0', null ],
|
|
[ 'part_0/', '' ],
|
|
[ 'part_0/foo', 'foo' ],
|
|
[ 'part_1/foo', null ],
|
|
[ 'part_0/foo/bar', 'foo/bar' ]
|
|
].forEach( ( [ pageName, expected ] ) =>
|
|
QUnit.test( 'setSelectionByPageName: ' + pageName, ( assert ) => {
|
|
const transclusion = new ve.dm.MWTransclusionModel(),
|
|
template = new ve.dm.MWTemplateModel( transclusion, { wt: '' } ),
|
|
partWidget = new ve.ui.MWTransclusionOutlineTemplateWidget( template ),
|
|
widget = new ve.ui.MWTransclusionOutlineWidget();
|
|
|
|
// eslint-disable-next-line camelcase
|
|
widget.partWidgets.part_0 = partWidget;
|
|
|
|
let actual = null;
|
|
partWidget.highlightParameter = ( paramName ) => {
|
|
actual = paramName;
|
|
};
|
|
|
|
widget.setSelectionByPageName( pageName );
|
|
assert.strictEqual( actual, expected );
|
|
} )
|
|
);
|