mediawiki-extensions-Visual.../modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js
Ed Sanders 0e51180709 Update VE core submodule to master (55a5cdc): use new ve.ui.Dialogs and ve.ui.Inspectors
Move various bits of code from initialize to setup as required.

MWDialog is now useless so use ve.ui.Dialog directly.

New changes:
0b2d03f [BREAKING CHANGE] Pass fragments, not surfaces, to windows (reprise)
0101ac4 Update OOjs UI to v0.1.0-pre (ac6848398c)

Change-Id: I0fae3e5ff2bd0da5b74c244af226b07b1f5883bd
2014-04-09 20:28:30 -07:00

338 lines
10 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*!
* VisualEditor user interface MWSettingsPage class.
*
* @copyright 2011-2014 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* MediaWiki meta dialog settings page.
*
* @class
* @extends OO.ui.PageLayout
*
* @constructor
* @param {string} name Unique symbolic name of page
* @param {Object} [config] Configuration options
*/
ve.ui.MWSettingsPage = function VeUiMWSettingsPage( name, config ) {
// Parent constructor
OO.ui.PageLayout.call( this, name, config );
// Properties
this.metaList = null;
this.tocOptionTouched = false;
this.redirectOptionsTouched = false;
this.tableOfContentsTouched = false;
this.label = ve.msg( 'visualeditor-dialog-meta-settings-section' );
this.settingsFieldset = new OO.ui.FieldsetLayout( {
'$': this.$,
'label': ve.msg( 'visualeditor-dialog-meta-settings-label' ),
'icon': 'settings'
} );
// Initialization
// Table of Contents items
this.tableOfContents = new OO.ui.FieldLayout(
new OO.ui.ButtonSelectWidget( { '$': this.$ } )
.addItems( [
new OO.ui.ButtonOptionWidget(
'mwTOCForce',
{ 'label': ve.msg( 'visualeditor-dialog-meta-settings-toc-force' ) }
),
new OO.ui.ButtonOptionWidget(
'default',
{ 'label': ve.msg( 'visualeditor-dialog-meta-settings-toc-default' ) }
),
new OO.ui.ButtonOptionWidget(
'mwTOCDisable',
{ 'label': ve.msg( 'visualeditor-dialog-meta-settings-toc-disable' ) }
)
] )
.connect( this, { 'select': 'onTableOfContentsFieldChange' } ),
{
'$': this.$,
'align': 'top',
'label': ve.msg( 'visualeditor-dialog-meta-settings-toc-label' )
}
);
// Redirect items
this.enableRedirectInput = new OO.ui.CheckboxInputWidget( { '$': this.$ } );
this.enableRedirectField = new OO.ui.FieldLayout(
this.enableRedirectInput,
{
'$': this.$,
'align': 'inline',
'label': ve.msg( 'visualeditor-dialog-meta-settings-redirect-label' )
}
);
this.redirectTargetInput = new ve.ui.MWTitleInputWidget( {
'$': this.$,
'placeholder': ve.msg( 'visualeditor-dialog-meta-settings-redirect-placeholder' ),
} );
this.redirectTargetField = new OO.ui.FieldLayout(
this.redirectTargetInput,
{
'$': this.$,
'align': 'top'
}
);
this.enableStaticRedirectInput = new OO.ui.CheckboxInputWidget( { '$': this.$ } );
this.enableStaticRedirectField = new OO.ui.FieldLayout(
this.enableStaticRedirectInput,
{
'$': this.$,
'align': 'inline',
'label': ve.msg( 'visualeditor-dialog-meta-settings-redirect-staticlabel' )
}
);
this.enableRedirectInput.connect( this, { 'change': 'onEnableRedirectChange' } );
this.redirectTargetInput.connect( this, { 'change': 'onRedirectTargetChange' } );
this.enableStaticRedirectInput.connect( this, { 'change': 'onEnableStaticRedirectChange' } );
// Disable section edit links items
this.disabledSectionEditLinks = new OO.ui.FieldLayout(
new OO.ui.CheckboxInputWidget( { '$': this.$ } ),
{
'$': this.$,
'align': 'inline',
'label': ve.msg( 'visualeditor-dialog-meta-settings-noeditsection-label' ),
}
);
this.settingsFieldset.addItems( [
this.enableRedirectField,
this.redirectTargetField,
this.enableStaticRedirectField,
this.tableOfContents,
this.disabledSectionEditLinks
] );
this.$element.append( this.settingsFieldset.$element );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWSettingsPage, OO.ui.PageLayout );
/* Methods */
/* Table of Contents methods */
/**
* @inheritdoc
*/
ve.ui.MWSettingsPage.prototype.setOutlineItem = function ( outlineItem ) {
// Parent method
OO.ui.PageLayout.prototype.setOutlineItem.call( this, outlineItem );
if ( this.outlineItem ) {
this.outlineItem
.setIcon( 'settings' )
.setLabel( ve.msg( 'visualeditor-dialog-meta-settings-section' ) );
}
};
/**
* Handle Table Of Contents display change events.
*
* @method
*/
ve.ui.MWSettingsPage.prototype.onTableOfContentsFieldChange = function () {
this.tableOfContentsTouched = true;
};
/**
* Get Table Of Contents option
*
* @returns {ve.dm.MetaItem|null} TOC option, if any
*/
ve.ui.MWSettingsPage.prototype.getTableOfContentsMetaItem = function () {
return this.metaList.getItemsInGroup( 'mwTOC' )[0] || null;
};
/* Redirect methods */
/**
* Handle redirect state change events.
*
* @param {boolean} value Whether a redirect is to be set for this page
*/
ve.ui.MWSettingsPage.prototype.onEnableRedirectChange = function ( value ) {
this.redirectTargetInput.setDisabled( !value );
this.enableStaticRedirectInput.setDisabled( !value );
if ( !value ) {
this.redirectTargetInput.setValue( '' );
this.enableStaticRedirectInput.setValue( false );
}
this.redirectOptionsTouched = true;
};
/**
* Handle redirect target change events.
*/
ve.ui.MWSettingsPage.prototype.onRedirectTargetChange = function () {
this.redirectOptionsTouched = true;
};
/**
* Handle static redirect state change events.
*/
ve.ui.MWSettingsPage.prototype.onEnableStaticRedirectChange = function () {
this.redirectOptionsTouched = true;
};
/**
* Get the redirect item
*
* @returns {Object|null} Redirect target, if any
*/
ve.ui.MWSettingsPage.prototype.getRedirectTargetItem = function () {
return this.metaList.getItemsInGroup( 'mwRedirect' )[0] || null;
};
/**
* Get the static redirect item
*
* @returns {Object|null} Redirect target, if any
*/
ve.ui.MWSettingsPage.prototype.getRedirectStaticItem = function () {
return this.metaList.getItemsInGroup( 'mwStaticRedirect' )[0] || null;
};
/**
* Get the section edit link disabling item
*
* @returns {Object|null} Section edit link disabling meta item, if any
*/
ve.ui.MWSettingsPage.prototype.getDisableSectionEditLinksItem = function () {
return this.metaList.getItemsInGroup( 'mwNoEditSection' )[0] || null;
};
/**
* Setup settings page.
*
* @param {ve.dm.MetaList} metaList Meta list
* @param {Object} [data] Dialog setup data
*/
ve.ui.MWSettingsPage.prototype.setup = function ( metaList ) {
this.metaList = metaList;
var // Table of Contents items
tableOfContentsMetaItem = this.getTableOfContentsMetaItem(),
tableOfContentsField = this.tableOfContents.getField(),
tableOfContentsMode = tableOfContentsMetaItem &&
tableOfContentsMetaItem.getType() || 'default',
// Redirect items
redirectTargetItem = this.getRedirectTargetItem(),
redirectTarget = redirectTargetItem && redirectTargetItem.getAttribute( 'title' ) || '',
redirectStatic = this.getRedirectStaticItem();
// Table of Contents items
tableOfContentsField.selectItem( tableOfContentsField.getItemFromData( tableOfContentsMode ) );
this.tableOfContentsTouched = false;
// Redirect items (disabled states set by change event)
this.enableRedirectInput.setValue( !!redirectTargetItem );
this.redirectTargetInput.setValue( redirectTarget );
this.redirectTargetInput.setDisabled( !redirectTargetItem );
this.enableStaticRedirectInput.setValue( !!redirectStatic );
this.enableStaticRedirectInput.setDisabled( !redirectTargetItem );
this.redirectOptionsTouched = false;
// Disable section edit links items
this.disabledSectionEditLinks.getField().setValue( !!this.getDisableSectionEditLinksItem() );
};
/**
* Tear down settings page.
*
* @param {Object} [data] Dialog tear down data
*/
ve.ui.MWSettingsPage.prototype.teardown = function ( data ) {
// Data initialisation
data = data || {};
var // Table of Contents items
tableOfContentsMetaItem = this.getTableOfContentsMetaItem(),
tableOfContentsSelectedItem = this.tableOfContents.getField().getSelectedItem(),
tableOfContentsValue = tableOfContentsSelectedItem && tableOfContentsSelectedItem.getData(),
// Redirect items
currentRedirectTargetItem = this.getRedirectTargetItem(),
newRedirectData = this.redirectTargetInput.getValue(),
newRedirectItemData = { 'type': 'mwRedirect', 'attributes': { 'title': newRedirectData } },
currentStaticRedirectItem = this.getRedirectStaticItem(),
newStaticRedirectState = this.enableStaticRedirectInput.getValue(),
// Disable section edit links items
currentDisableSectionEditLinksItem = this.getDisableSectionEditLinksItem(),
newDisableSectionEditState = this.disabledSectionEditLinks.getField().getValue();
// Alter the TOC option flag iff it's been touched & is actually different
if ( this.tableOfContentsTouched ) {
if ( tableOfContentsValue === 'default' ) {
if ( tableOfContentsMetaItem ) {
tableOfContentsMetaItem.remove();
}
} else {
if ( !tableOfContentsMetaItem ) {
this.metaList.insertMeta( { 'type': tableOfContentsValue } );
} else if ( tableOfContentsMetaItem.getType() !== tableOfContentsValue ) {
tableOfContentsMetaItem.replaceWith(
ve.extendObject( true, {},
tableOfContentsMetaItem.getElement(),
{ 'type': tableOfContentsValue }
)
);
}
}
}
// Alter the redirect options iff they've been touched & are different
if ( this.redirectOptionsTouched ) {
if ( currentRedirectTargetItem ) {
if ( newRedirectData ) {
if ( currentRedirectTargetItem.getAttribute( 'title' ) !== newRedirectData ) {
// There was a redirect and is a new one, but they differ, so replace
currentRedirectTargetItem.replaceWith(
ve.extendObject( true, {},
currentRedirectTargetItem.getElement(),
newRedirectItemData
) );
}
} else {
// There was a redirect and is no new one, so remove
currentRedirectTargetItem.remove();
}
} else {
if ( newRedirectData ) {
// There's no existing redirect but there is a new one, so create
// HACK: Putting this at index 0, offset 0 so that it works bug 61862
this.metaList.insertMeta( newRedirectItemData, 0, 0 );
}
}
if ( currentStaticRedirectItem && ( !newStaticRedirectState || !newRedirectData ) ) {
currentStaticRedirectItem.remove();
}
if ( !currentStaticRedirectItem && newStaticRedirectState && newRedirectData ) {
this.metaList.insertMeta( { 'type': 'mwStaticRedirect' } );
}
}
// Disable section edit links items
if ( currentDisableSectionEditLinksItem && !newDisableSectionEditState ) {
currentDisableSectionEditLinksItem.remove();
}
if ( !currentDisableSectionEditLinksItem && newDisableSectionEditState ) {
this.metaList.insertMeta( { 'type': 'mwNoEditSection' } );
}
this.metaList = null;
};