/*
* This file is part of the MediaWiki extension MultimediaViewer.
*
* MultimediaViewer is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* MultimediaViewer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MultimediaViewer. If not, see .
*/
const { Config } = require( 'mmv.bootstrap' );
const { isMediaViewerEnabledOnClick } = require( 'mmv.head' );
const Dialog = require( './mmv.ui.dialog.js' );
const { helpLink } = require( '../config.json' );
/**
* Represents the viewing options dialog and the link to open it.
*/
class OptionsDialog extends Dialog {
/**
* @param {jQuery} $container the element to which the dialog will be appended
* @param {jQuery} $openButton the button which opens the dialog. Only used for positioning.
*/
constructor( $container, $openButton ) {
super( $container, $openButton );
this.$dialog.addClass( 'mw-mmv-options-dialog' );
this.eventPrefix = 'options';
this.initPanel();
}
attach() {
this.handleEvent( 'mmv-options-open', this.handleOpenCloseClick.bind( this ) );
this.handleEvent( 'mmv-reuse-open', this.closeDialog.bind( this ) );
this.handleEvent( 'mmv-download-open', this.closeDialog.bind( this ) );
}
/**
* Initialises UI elements.
*/
initPanel() {
this.initEnableConfirmation();
this.initDisableConfirmation();
this.initEnableDiv();
this.initDisableDiv();
}
/**
* Initialises the enable confirmation pane.
*/
initEnableConfirmation() {
this.createConfirmationPane(
'mw-mmv-enable-confirmation',
'$enableConfirmation',
[
mw.msg( 'multimediaviewer-enable-confirmation-header' ),
mw.msg( 'multimediaviewer-enable-confirmation-text', mw.config.get( 'wgSiteName' ) )
] );
}
/**
* Initialises the disable confirmation pane.
*/
initDisableConfirmation() {
this.createConfirmationPane(
'mw-mmv-disable-confirmation',
'$disableConfirmation',
[
mw.msg( 'multimediaviewer-disable-confirmation-header' ),
mw.msg( 'multimediaviewer-disable-confirmation-text', mw.config.get( 'wgSiteName' ) )
] );
}
/**
* Initialises the enable action pane.
*/
initEnableDiv() {
this.createActionPane(
'mw-mmv-options-enable',
'$enableDiv',
mw.msg( 'multimediaviewer-enable-submit-button' ),
[
mw.msg( 'multimediaviewer-enable-dialog-header' ),
mw.msg( 'multimediaviewer-enable-text-header' )
], true );
}
/**
* Initialises the disable action pane.
*/
initDisableDiv() {
this.createActionPane(
'mw-mmv-options-disable',
'$disableDiv',
mw.msg( 'multimediaviewer-option-submit-button' ),
[
mw.msg( 'multimediaviewer-options-dialog-header' ),
mw.msg( 'multimediaviewer-options-text-header' ),
mw.msg( 'multimediaviewer-options-text-body' )
], false );
}
/**
* Hides all of the divs.
*/
hideDivs() {
this.$dialog.removeClass( 'mw-mmv-disable-confirmation-shown mw-mmv-enable-confirmation-shown mw-mmv-enable-div-shown' );
this.$disableDiv
.add( this.$disableConfirmation )
.add( this.$enableDiv )
.add( this.$enableConfirmation )
.removeClass( 'mw-mmv-shown' );
}
/**
* Shows the confirmation div for the disable action.
*/
showDisableConfirmation() {
this.hideDivs();
this.$disableConfirmation.addClass( 'mw-mmv-shown' );
this.$dialog.addClass( 'mw-mmv-disable-confirmation-shown' );
}
/**
* Shows the confirmation div for the enable action.
*/
showEnableConfirmation() {
this.hideDivs();
this.$enableConfirmation.addClass( 'mw-mmv-shown' );
this.$dialog.addClass( 'mw-mmv-enable-confirmation-shown' );
}
/**
* Fired when the dialog is opened.
*
* @event OptionsDialog#mmv-options-opened
*/
/**
* Opens a dialog with information about file reuse.
*/
openDialog() {
if ( isMediaViewerEnabledOnClick() ) {
this.$disableDiv.addClass( 'mw-mmv-shown' );
} else {
this.$enableDiv.addClass( 'mw-mmv-shown' );
this.$dialog.addClass( 'mw-mmv-enable-div-shown' );
}
super.openDialog();
$( document ).trigger( 'mmv-options-opened' );
}
/**
* Fired when the dialog is closed.
*
* @event OptionsDialog#mmv-options-closed
*/
/**
* Closes the options dialog.
*
* @param {Event} [e] Event object when the close action is caused by a user
* action, as opposed to closing the window or something.
*/
closeDialog( e ) {
const wasConfirmation = this.$dialog.is( '.mw-mmv-disable-confirmation-shown' ) || this.$dialog.is( '.mw-mmv-enable-confirmation-shown' );
super.closeDialog();
$( document ).trigger( 'mmv-options-closed' );
this.hideDivs();
if ( e && $( e.target ).is( '.mw-mmv-options-button' ) && wasConfirmation ) {
this.openDialog();
}
}
/**
* Creates a confirmation pane.
*
* @param {string} divClass Class applied to main div.
* @param {string} propName Name of the property on this object to which we'll assign the div.
* @param {string} msgs See #addText
*/
createConfirmationPane( divClass, propName, msgs ) {
const $div = $( '
' )
// The following classes are used here:
// * mw-mmv-enable-confirmation
// * mw-mmv-disable-confirmation
.addClass( divClass )
.appendTo( this.$dialog );
$( '
' )
.text( '\u00A0' )
.addClass( 'mw-mmv-confirmation-close' )
.on( 'click', () => this.closeDialog() )
.appendTo( $div );
this.addText( $div, msgs );
this[ propName ] = $div;
}
/**
* Creates an action pane.
*
* @param {string} divClass Class applied to main div.
* @param {string} propName Name of the property on this object to which we'll assign the div.
* @param {string} smsg Message for the submit button.
* @param {string} msgs See #addText
* @param {boolean} enabled Whether this dialog is an enable one.
*/
createActionPane( divClass, propName, smsg, msgs, enabled ) {
const $div = $( '
' )
// The following classes are used here:
// * mw-mmv-options-enable
// * mw-mmv-options-disable
.addClass( divClass )
.appendTo( this.$dialog );
if ( enabled ) {
$( '
' )
.addClass( 'mw-mmv-options-enable-alert' )
.text( mw.msg( 'multimediaviewer-enable-alert' ) )
.appendTo( $div );
}
this.addText( $div, msgs );
this.addInfoLink( $div );
this.makeButtons( $div, smsg, enabled );
this[ propName ] = $div;
}
/**
* Creates buttons for the dialog.
*
* @param {jQuery} $container
* @param {string} smsg Message for the submit button.
* @param {boolean} enabled Whether the viewer is enabled after this dialog is submitted.
*/
makeButtons( $container, smsg, enabled ) {
const $submitDiv = $( '
' )
.addClass( 'mw-mmv-options-submit' )
.appendTo( $container );
this.makeSubmitButton(
$submitDiv,
smsg,
enabled
);
this.makeCancelButton( $submitDiv );
}
/**
* Makes a submit button for one of the panels.
*
* @param {jQuery} $submitDiv The div for the buttons in the dialog.
* @param {string} msg The string to put in the button.
* @param {boolean} enabled Whether to turn the viewer on or off when this button is pressed.
* @return {jQuery} Submit button
*/
makeSubmitButton( $submitDiv, msg, enabled ) {
return $( '