2010-09-15 03:08:35 +00:00
|
|
|
/**
|
|
|
|
* Dialog Module for wikiEditor
|
|
|
|
*/
|
2018-11-12 22:28:40 +00:00
|
|
|
( function () {
|
2010-09-15 03:08:35 +00:00
|
|
|
|
2019-07-20 08:09:04 +00:00
|
|
|
var dialogsModule = {
|
2016-11-20 17:13:39 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* API accessible functions
|
|
|
|
*/
|
|
|
|
api: {
|
|
|
|
addDialog: function ( context, data ) {
|
2019-07-20 08:09:04 +00:00
|
|
|
dialogsModule.fn.create( context, data );
|
2016-11-20 17:13:39 +00:00
|
|
|
},
|
|
|
|
openDialog: function ( context, module ) {
|
2019-07-20 08:09:04 +00:00
|
|
|
if ( module in dialogsModule.modules ) {
|
2021-06-15 14:45:13 +00:00
|
|
|
var mod = dialogsModule.modules[ module ];
|
|
|
|
var $dialog = $( '#' + mod.id );
|
2016-11-20 17:13:39 +00:00
|
|
|
if ( $dialog.length === 0 ) {
|
2019-07-20 08:09:04 +00:00
|
|
|
dialogsModule.fn.reallyCreate( context, mod, module );
|
2016-11-20 17:13:39 +00:00
|
|
|
$dialog = $( '#' + mod.id );
|
|
|
|
}
|
2012-07-03 05:52:27 +00:00
|
|
|
|
2016-11-20 17:13:39 +00:00
|
|
|
// Workaround for bug in jQuery UI: close button in top right retains focus
|
|
|
|
$dialog.closest( '.ui-dialog' )
|
|
|
|
.find( '.ui-dialog-titlebar-close' )
|
|
|
|
.removeClass( 'ui-state-focus' );
|
2012-07-03 05:52:27 +00:00
|
|
|
|
2016-11-20 17:13:39 +00:00
|
|
|
$dialog.dialog( 'open' );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
closeDialog: function ( context, module ) {
|
2019-07-20 08:09:04 +00:00
|
|
|
if ( module in dialogsModule.modules ) {
|
|
|
|
$( '#' + dialogsModule.modules[ module ].id ).dialog( 'close' );
|
2016-11-20 17:13:39 +00:00
|
|
|
}
|
2010-09-15 03:08:35 +00:00
|
|
|
}
|
2012-07-03 05:52:27 +00:00
|
|
|
},
|
2011-09-13 08:56:32 +00:00
|
|
|
|
2012-07-03 05:52:27 +00:00
|
|
|
/**
|
2016-11-20 17:13:39 +00:00
|
|
|
* Internally used functions
|
2012-07-03 05:52:27 +00:00
|
|
|
*/
|
2016-11-20 17:13:39 +00:00
|
|
|
fn: {
|
|
|
|
/**
|
|
|
|
* Creates a dialog module within a wikiEditor
|
|
|
|
*
|
|
|
|
* @param {Object} context Context object of editor to create module in
|
|
|
|
* @param {Object} config Configuration object to create module from
|
|
|
|
*/
|
|
|
|
create: function ( context, config ) {
|
|
|
|
// Defer building of modules, unless they require immediate creation
|
2021-06-15 14:45:13 +00:00
|
|
|
for ( var mod in config ) {
|
|
|
|
var module = config[ mod ];
|
2017-12-29 14:09:21 +00:00
|
|
|
// Only create the dialog if it isn't filtered and doesn't exist yet
|
2021-06-15 14:45:13 +00:00
|
|
|
var filtered = false;
|
2016-11-20 17:13:39 +00:00
|
|
|
if ( typeof module.filters !== 'undefined' ) {
|
2021-06-15 14:45:13 +00:00
|
|
|
for ( var i = 0; i < module.filters.length; i++ ) {
|
2016-11-20 17:13:39 +00:00
|
|
|
if ( $( module.filters[ i ] ).length === 0 ) {
|
|
|
|
filtered = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// If the dialog already exists, but for another textarea, simply remove it
|
2021-06-15 14:45:13 +00:00
|
|
|
var $existingDialog = $( '#' + module.id );
|
2016-11-20 17:13:39 +00:00
|
|
|
if ( $existingDialog.length > 0 && $existingDialog.data( 'context' ).$textarea !== context.$textarea ) {
|
|
|
|
$existingDialog.remove();
|
|
|
|
}
|
|
|
|
// Re-select from the DOM, we might have removed the dialog just now
|
|
|
|
$existingDialog = $( '#' + module.id );
|
2017-12-29 14:09:21 +00:00
|
|
|
if ( !filtered && $existingDialog.length === 0 ) {
|
2019-07-20 08:09:04 +00:00
|
|
|
dialogsModule.modules[ mod ] = module;
|
2016-11-20 17:13:39 +00:00
|
|
|
context.$textarea.trigger( 'wikiEditor-dialogs-setup-' + mod );
|
|
|
|
// If this dialog requires immediate creation, create it now
|
|
|
|
if ( typeof module.immediateCreate !== 'undefined' && module.immediateCreate ) {
|
2019-07-20 08:09:04 +00:00
|
|
|
dialogsModule.fn.reallyCreate( context, module, mod );
|
2012-07-03 05:52:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-11-20 17:13:39 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Build the actual dialog. This done on-demand rather than in create()
|
|
|
|
*
|
|
|
|
* @param {Object} context Context object of editor dialog belongs to
|
|
|
|
* @param {Object} module Dialog module object
|
2019-07-20 08:09:04 +00:00
|
|
|
* @param {string} name Dialog name (key in dialogsModule.modules)
|
2016-11-20 17:13:39 +00:00
|
|
|
*/
|
|
|
|
reallyCreate: function ( context, module, name ) {
|
2021-06-15 14:45:13 +00:00
|
|
|
var configuration = module.dialog;
|
2016-11-20 17:13:39 +00:00
|
|
|
// Add some stuff to configuration
|
|
|
|
configuration.bgiframe = true;
|
|
|
|
configuration.autoOpen = false;
|
|
|
|
// By default our dialogs are modal, unless explicitly defined in their specific configuration.
|
|
|
|
if ( typeof configuration.modal === 'undefined' ) {
|
|
|
|
configuration.modal = true;
|
2012-07-03 05:52:27 +00:00
|
|
|
}
|
2018-09-05 21:45:07 +00:00
|
|
|
configuration.title = $.wikiEditor.autoSafeMsg( module, 'title' );
|
2016-11-20 17:13:39 +00:00
|
|
|
// Transform messages in keys
|
|
|
|
// Stupid JS won't let us do stuff like
|
|
|
|
// foo = { mw.msg( 'bar' ): baz }
|
|
|
|
configuration.newButtons = {};
|
2021-06-15 14:45:13 +00:00
|
|
|
for ( var msg in configuration.buttons ) {
|
2019-10-29 22:16:13 +00:00
|
|
|
// eslint-disable-next-line mediawiki/msg-doc
|
2016-11-20 17:13:39 +00:00
|
|
|
configuration.newButtons[ mw.msg( msg ) ] = configuration.buttons[ msg ];
|
2012-07-03 05:52:27 +00:00
|
|
|
}
|
2016-11-20 17:13:39 +00:00
|
|
|
configuration.buttons = configuration.newButtons;
|
2021-06-15 14:45:13 +00:00
|
|
|
var $content;
|
2016-11-20 17:13:39 +00:00
|
|
|
if ( module.htmlTemplate ) {
|
2017-11-22 20:17:37 +00:00
|
|
|
$content = mw.template.get( 'ext.wikiEditor', module.htmlTemplate ).render();
|
2018-11-12 22:28:40 +00:00
|
|
|
} else if ( module.html instanceof $ ) {
|
2016-11-20 17:13:39 +00:00
|
|
|
$content = module.html;
|
|
|
|
} else {
|
|
|
|
$content = $( $.parseHTML( module.html ) );
|
|
|
|
}
|
|
|
|
// Create the dialog <div>
|
2021-06-15 14:45:13 +00:00
|
|
|
var $dialogDiv = $( '<div>' )
|
2016-11-20 17:13:39 +00:00
|
|
|
.attr( 'id', module.id )
|
|
|
|
.append( $content )
|
|
|
|
.data( 'context', context )
|
2019-12-16 10:36:27 +00:00
|
|
|
.appendTo( document.body )
|
2016-11-20 17:13:39 +00:00
|
|
|
.each( module.init )
|
|
|
|
.dialog( configuration );
|
2021-10-12 09:35:03 +00:00
|
|
|
|
2017-03-24 07:51:20 +00:00
|
|
|
$dialogDiv.on( 'dialogclose', function () {
|
2016-11-20 17:13:39 +00:00
|
|
|
context.fn.restoreSelection();
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Let the outside world know we set up this dialog
|
|
|
|
context.$textarea.trigger( 'wikiEditor-dialogs-loaded-' + name );
|
2012-07-03 05:52:27 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2016-11-20 17:13:39 +00:00
|
|
|
// This stuff is just hanging here, perhaps we could come up with a better home for this stuff
|
|
|
|
modules: {},
|
2015-11-15 14:30:18 +00:00
|
|
|
|
2016-11-20 17:13:39 +00:00
|
|
|
quickDialog: function ( body, settings ) {
|
|
|
|
$( '<div>' )
|
|
|
|
.text( body )
|
2019-12-16 10:36:27 +00:00
|
|
|
.appendTo( document.body )
|
2016-11-20 17:13:39 +00:00
|
|
|
.dialog( $.extend( {
|
|
|
|
bgiframe: true,
|
|
|
|
modal: true
|
|
|
|
}, settings ) )
|
|
|
|
.dialog( 'open' );
|
2010-09-15 03:08:35 +00:00
|
|
|
}
|
2016-11-20 17:13:39 +00:00
|
|
|
|
|
|
|
};
|
2012-07-03 05:52:27 +00:00
|
|
|
|
2019-07-20 08:09:04 +00:00
|
|
|
module.exports = dialogsModule;
|
|
|
|
|
2018-11-12 22:28:40 +00:00
|
|
|
}() );
|