feat: generate tab header in visual edit mode

This commit is contained in:
alistair3149 2022-04-22 00:38:16 -04:00
parent 3454f7b2ce
commit 84273da412
No known key found for this signature in database
GPG key ID: 94D081060FD3DD9C
4 changed files with 82 additions and 2 deletions

View file

@ -60,8 +60,7 @@
"ve-tabberNeue/ve.ui.MWTabberDialog.less"
],
"dependencies": [
"ext.visualEditor.mwcore",
"ext.tabberNeue"
"ext.visualEditor.mwcore"
],
"messages": [
"tabberneue-visualeditor-mwtabberdialog-title"

View file

@ -0,0 +1,5 @@
{
"globals": {
"ve": true
}
}

View file

@ -12,6 +12,8 @@ ve.ce.MWTabberNode = function VeCeMWTabberNode() {
// Parent constructor
ve.ce.MWTabberNode.super.apply( this, arguments );
this.renderHeader = OO.ui.debounce( this.renderHeader.bind( this ), 300 );
// DOM changes
this.$element.addClass( 've-ce-mwTabberNode' );
};
@ -28,6 +30,72 @@ ve.ce.MWTabberNode.static.tagName = 'div';
ve.ce.MWTabberNode.static.primaryCommandName = 'mwTabber';
/* Methods */
var lastHeader;
/**
* @inheritdoc
*/
ve.ce.MWTabberNode.prototype.onSetup = function () {
// Parent method
ve.ce.MWTabberNode.super.prototype.onSetup.call( this );
var tabber = this.$element[ 0 ];
// Do not render header if it is already rendered
if (
tabber.firstElementChild &&
tabber.firstElementChild !== lastHeader &&
!tabber.classList.contains( 'tabber--live' ) &&
tabber.classList.contains( 'tabber' )
)
{
this.renderHeader( tabber );
}
};
/**
* HACK: Render a simple static tab header for preview
*
* Since it is only for preview it does not have to be fancy,
* just having the right HTML and CSS will be sufficient
*
* @param {Object} Tabber HTMLElement
*/
ve.ce.MWTabberNode.prototype.renderHeader = function ( tabber ) {
var tabPanels = tabber.querySelectorAll( ':scope > .tabber__section > .tabber__panel' ),
container = document.createElement( 'header' ),
tabList = document.createElement( 'nav' )
fragment = new DocumentFragment();
Array.prototype.forEach.call( tabPanels, function( tabPanel, index ) {
var tab = document.createElement( 'a' );
tab.innerText = tabPanel.title;
tab.classList.add( 'tabber__tab' );
// Make first tab active
if ( index === 0 ) {
tab.classList.add( 'tabber__tab--active' );
}
fragment.append( tab );
} );
tabList.append( fragment );
container.classList.add( 'tabber__header' );
tabList.classList.add( 'tabber__tabs' );
container.append( tabList );
tabber.prepend( container );
tabber.classList.add( 'tabber--live' );
lastHeader = tabber.firstElementChild;
}
/* Registration */
ve.ce.nodeFactory.register( ve.ce.MWTabberNode );

View file

@ -64,6 +64,14 @@ ve.ui.MWTabberDialog.prototype.initialize = function () {
.append( panel.$element );
};
/**
* @inheritdoc
*/
ve.ui.MWTabberDialog.prototype.updateMwData = function ( mwData ) {
// Parent method
ve.ui.MWTabberDialog.super.prototype.updateMwData.call( this, mwData );
};
/* Registration */