summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.dialog.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.dialog.js')
-rw-r--r--www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.dialog.js258
1 files changed, 258 insertions, 0 deletions
diff --git a/www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.dialog.js b/www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.dialog.js
new file mode 100644
index 00000000..6738b50b
--- /dev/null
+++ b/www/wiki/extensions/MultimediaViewer/resources/mmv/ui/mmv.ui.dialog.js
@@ -0,0 +1,258 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+( function ( mw, $, oo ) {
+ // Shortcut for prototype later
+ var DP;
+
+ /**
+ * Represents a dialog and the link to open it.
+ *
+ * @class mw.mmv.ui.Dialog
+ * @extends mw.mmv.ui.Element
+ * @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.
+ * @param {mw.mmv.Config} config
+ */
+ function Dialog( $container, $openButton, config ) {
+ mw.mmv.ui.Element.call( this, $container );
+
+ /** @property {boolean} isOpen Whether or not the dialog is open. */
+ this.isOpen = false;
+
+ /**
+ * @property {string[]} loadDependencies Dependencies to load before showing the dialog.
+ */
+ this.loadDependencies = [];
+
+ /**
+ * @property {string} eventPrefix Prefix specific to the class to be applied to events.
+ */
+ this.eventPrefix = '';
+ /** @property {mw.mmv.Config} config - */
+ this.config = config;
+
+ /** @property {jQuery} $openButton The click target which opens the dialog. */
+ this.$openButton = $openButton;
+
+ /** @type {jQuery} $dialog The main dialog container */
+ this.$dialog = $( '<div>' )
+ .addClass( 'mw-mmv-dialog' );
+
+ /**
+ * @property {jQuery} $downArrow Tip of the dialog pointing to $openButton. Called
+ * downArrow for historical reasons although it does not point down anymore.
+ */
+ this.$downArrow = $( '<div>' )
+ .addClass( 'mw-mmv-dialog-down-arrow' )
+ .appendTo( this.$dialog );
+
+ this.initWarning();
+
+ this.$dialog.appendTo( this.$container );
+ }
+
+ oo.inheritClass( Dialog, mw.mmv.ui.Element );
+ DP = Dialog.prototype;
+
+ /**
+ * Creates the DOM element that setWarning()/clearWarning() will operate on.
+ * @private
+ */
+ DP.initWarning = function () {
+ this.$warning = $( '<div>' )
+ .addClass( 'mw-mmv-dialog-warning' )
+ .hide()
+ .click( function ( e ) {
+ // prevent other click handlers such as the download CTA from intercepting clicks at the warning
+ e.stopPropagation();
+ } )
+ .appendTo( this.$dialog );
+ };
+
+ /**
+ * Handles click on link that opens/closes the dialog.
+ *
+ * @param {jQuery.Event} openEvent Event object for the mmv-$dialog-open event.
+ * @param {jQuery.Event} e Event object for the click event.
+ * @return {boolean} False to cancel the default event
+ */
+ DP.handleOpenCloseClick = function ( openEvent, e ) {
+ var dialog = this;
+
+ mw.loader.using( this.loadDependencies, function () {
+ dialog.dependenciesLoaded = true;
+ dialog.toggleDialog( e );
+ }, function ( error ) {
+ if ( window.console && window.console.error ) {
+ window.console.error( 'mw.loader.using error when trying to load dialog dependencies', error );
+ }
+ } );
+
+ return false;
+ };
+
+ /**
+ * Toggles the open state on the dialog.
+ *
+ * @param {jQuery.Event} [e] Event object when the close action is caused by a user
+ * action, as opposed to closing the window or something.
+ */
+ DP.toggleDialog = function ( e ) {
+ if ( this.isOpen ) {
+ this.closeDialog( e );
+ } else {
+ this.openDialog();
+ }
+ };
+
+ /**
+ * Opens a dialog.
+ */
+ DP.openDialog = function () {
+ mw.mmv.actionLogger.log( this.eventPrefix + '-open' );
+
+ this.startListeningToOutsideClick();
+ this.$dialog.show();
+ this.isOpen = true;
+ this.$openButton.addClass( 'mw-mmv-dialog-open' );
+ };
+
+ /**
+ * Closes a dialog.
+ */
+ DP.closeDialog = function () {
+ if ( this.isOpen ) {
+ mw.mmv.actionLogger.log( this.eventPrefix + '-close' );
+ }
+
+ this.stopListeningToOutsideClick();
+ this.$dialog.hide();
+ this.isOpen = false;
+ this.$openButton.removeClass( 'mw-mmv-dialog-open' );
+ };
+
+ /**
+ * Sets up the event handler which closes the dialog when the user clicks outside.
+ */
+ DP.startListeningToOutsideClick = function () {
+ var dialog = this;
+
+ this.outsideClickHandler = this.outsideClickHandler || function ( e ) {
+ var $clickTarget = $( e.target );
+
+ // Don't close the dialog if the click inside a dialog or on an navigation arrow
+ if (
+ $clickTarget.closest( dialog.$dialog ).length ||
+ $clickTarget.closest( '.mw-mmv-next-image' ).length ||
+ $clickTarget.closest( '.mw-mmv-prev-image' ).length ||
+ e.which === 3
+ ) {
+ return;
+ }
+
+ dialog.closeDialog();
+ return false;
+ };
+ $( document ).on( 'click.mmv.' + this.eventPrefix, this.outsideClickHandler );
+ };
+
+ /**
+ * Removes the event handler set up by startListeningToOutsideClick().
+ */
+ DP.stopListeningToOutsideClick = function () {
+ $( document ).off( 'click.mmv.' + this.eventPrefix, this.outsideClickHandler );
+ };
+
+ /**
+ * Clears listeners.
+ */
+ DP.unattach = function () {
+ mw.mmv.ui.Element.prototype.unattach.call( this );
+
+ this.stopListeningToOutsideClick();
+ };
+
+ /**
+ * @inheritdoc
+ */
+ DP.empty = function () {
+ this.closeDialog();
+ this.clearWarning();
+ };
+
+ /**
+ * Displays a warning ribbon.
+ * @param {string} content Content of the warning (can be HTML,
+ * setWarning does no escaping).
+ */
+ DP.setWarning = function ( content ) {
+ this.$warning
+ .empty()
+ .append( content )
+ .show();
+ this.$dialog.addClass( 'mw-mmv-warning-visible' );
+ };
+
+ /**
+ * Removes the warning ribbon.
+ */
+ DP.clearWarning = function () {
+ this.$warning.hide();
+ this.$dialog.removeClass( 'mw-mmv-warning-visible' );
+ };
+
+ /**
+ * @param {mw.mmv.model.Image} image
+ * @return {string[]}
+ */
+ DP.getImageWarnings = function ( image ) {
+ var warnings = [];
+
+ if ( image.deletionReason ) {
+ warnings.push( mw.message( 'multimediaviewer-reuse-warning-deletion' ).plain() );
+ // Don't inform about other warnings (they may be the cause of the deletion)
+ return warnings;
+ }
+
+ if ( !image.license || image.license.needsAttribution() && !image.author && !image.attribution ) {
+ warnings.push( mw.message( 'multimediaviewer-reuse-warning-noattribution' ).plain() );
+ }
+
+ if ( image.license && !image.license.isFree() ) {
+ warnings.push( mw.message( 'multimediaviewer-reuse-warning-nonfree' ).plain() );
+ }
+
+ return warnings;
+ };
+
+ /**
+ * @param {mw.mmv.model.Image} image
+ */
+ DP.showImageWarnings = function ( image ) {
+ var warnings = this.getImageWarnings( image );
+
+ if ( warnings.length > 0 ) {
+ warnings.push( mw.message( 'multimediaviewer-reuse-warning-generic', image.descriptionUrl ).parse() );
+ this.setWarning( warnings.join( '<br />' ) );
+ } else {
+ this.clearWarning();
+ }
+ };
+
+ mw.mmv.ui.Dialog = Dialog;
+}( mediaWiki, jQuery, OO ) );