X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js new file mode 100644 index 00000000..04ae33c6 --- /dev/null +++ b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js @@ -0,0 +1,237 @@ +/** + * Dialog Module for wikiEditor + */ +( function ( $, mw ) { + + $.wikiEditor.modules.dialogs = { + + /** + * Compatibility map + */ + browsers: { + // Left-to-right languages + ltr: { + msie: [ [ '>=', 9 ] ], + firefox: [ [ '>=', 4 ] ], + opera: [ [ '>=', '10.5' ] ], + safari: [ [ '>=', 5 ] ], + chrome: [ [ '>=', 5 ] ] + }, + // Right-to-left languages + rtl: { + msie: [ [ '>=', 9 ] ], + firefox: [ [ '>=', 4 ] ], + opera: [ [ '>=', '10.5' ] ], + safari: [ [ '>=', 5 ] ], + chrome: [ [ '>=', 5 ] ] + } + }, + + /** + * API accessible functions + */ + api: { + addDialog: function ( context, data ) { + $.wikiEditor.modules.dialogs.fn.create( context, data ); + }, + openDialog: function ( context, module ) { + var mod, $dialog; + if ( module in $.wikiEditor.modules.dialogs.modules ) { + mod = $.wikiEditor.modules.dialogs.modules[ module ]; + $dialog = $( '#' + mod.id ); + if ( $dialog.length === 0 ) { + $.wikiEditor.modules.dialogs.fn.reallyCreate( context, mod, module ); + $dialog = $( '#' + mod.id ); + } + + // 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' ); + + $dialog.dialog( 'open' ); + } + }, + closeDialog: function ( context, module ) { + if ( module in $.wikiEditor.modules.dialogs.modules ) { + $( '#' + $.wikiEditor.modules.dialogs.modules[ module ].id ).dialog( 'close' ); + } + } + }, + + /** + * Internally used functions + */ + 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 ) { + var mod, module, filtered, i, $existingDialog; + + // Defer building of modules, unless they require immediate creation + for ( mod in config ) { + module = config[ mod ]; + // Only create the dialog if it's supported, isn't filtered and doesn't exist yet + filtered = false; + if ( typeof module.filters !== 'undefined' ) { + for ( i = 0; i < module.filters.length; i++ ) { + if ( $( module.filters[ i ] ).length === 0 ) { + filtered = true; + break; + } + } + } + // If the dialog already exists, but for another textarea, simply remove it + $existingDialog = $( '#' + module.id ); + 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 ); + if ( !filtered && $.wikiEditor.isSupported( module ) && $existingDialog.length === 0 ) { + $.wikiEditor.modules.dialogs.modules[ mod ] = module; + context.$textarea.trigger( 'wikiEditor-dialogs-setup-' + mod ); + // If this dialog requires immediate creation, create it now + if ( typeof module.immediateCreate !== 'undefined' && module.immediateCreate ) { + $.wikiEditor.modules.dialogs.fn.reallyCreate( context, module, mod ); + } + } + } + }, + + /** + * 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 + * @param {string} name Dialog name (key in $.wikiEditor.modules.dialogs.modules) + */ + reallyCreate: function ( context, module, name ) { + var msg, $dialogDiv, $content, + configuration = module.dialog; + // 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; + } + configuration.title = $.wikiEditor.autoMsg( module, 'title' ); + // Transform messages in keys + // Stupid JS won't let us do stuff like + // foo = { mw.msg( 'bar' ): baz } + configuration.newButtons = {}; + for ( msg in configuration.buttons ) { + configuration.newButtons[ mw.msg( msg ) ] = configuration.buttons[ msg ]; + } + configuration.buttons = configuration.newButtons; + if ( module.htmlTemplate ) { + $content = mw.template.get( 'jquery.wikiEditor.dialogs.config', module.htmlTemplate ).render(); + } else if ( module.html instanceof jQuery ) { + $content = module.html; + } else { + $content = $( $.parseHTML( module.html ) ); + } + // Create the dialog