Your IP : 216.73.216.54


Current Path : /var/www/html/mediawiki-1.43.1/extensions/MediaUploader/resources/
Upload File :
Current File : /var/www/html/mediawiki-1.43.1/extensions/MediaUploader/resources/mw.UploadWizardDeedChooser.js

( function () {

	/**
	 * Interface widget to choose among various deeds -- for instance, if own work, or not own work, or other such cases.
	 *
	 * @param {Object} config The UW config
	 * @param {string|jQuery} selector Where to put this deed chooser
	 * @param {Object} deeds Keyed object of UploadWizardDeed items
	 * @param {mw.UploadWizardUpload[]} uploads Uploads that this applies to (this is just to make deleting and plurals work)
	 */
	mw.UploadWizardDeedChooser = function ( config, selector, deeds, uploads ) {
		var chooser = this;
		this.$selector = $( selector );
		this.uploads = uploads;
		this.deeds = deeds;

		// name for radio button set
		mw.UploadWizardDeedChooser.prototype.widgetCount++;
		this.name = 'deedChooser' + mw.UploadWizardDeedChooser.prototype.widgetCount.toString();

		this.onLayoutReady = function () {};

		Object.keys( this.deeds ).forEach( function ( name ) {
			var deed = chooser.deeds[ name ],
				radio = new OO.ui.RadioSelectWidget( {
					items: [ new OO.ui.RadioOptionWidget( {
						// eslint-disable-next-line mediawiki/msg-doc
						label: mw.message( 'mediauploader-source-' + deed.name, chooser.uploads.length ).text()
					} ) ]
				} ),
				// eslint-disable-next-line mediawiki/class-doc
				$deedInterface = $( '<div>' ).addClass( 'mediauploader-deed mediauploader-deed-' + deed.name ).append(
					$( '<div>' ).addClass( 'mediauploader-deed-option-title' ).append(
						$( '<span>' ).addClass( 'mediauploader-deed-header' ).append(
							radio.$element
						)
					),
					$( '<div>' ).addClass( 'mediauploader-deed-form' ).hide()
				);

			// Set the name attribute manually. We can't use RadioInputWidget which has
			// a name config because they don't emit change events. Ideally we would use
			// one RadioSelectWidget and not have to set this property.
			radio.items[ 0 ].radio.$input.attr( 'name', chooser.name );

			chooser.$selector.append( $deedInterface );

			deed.setFormFields( $deedInterface.find( '.mediauploader-deed-form' ) );

			if ( Object.keys( chooser.deeds ).length === 1 ) {
				chooser.onLayoutReady = chooser.selectDeed.bind( chooser, deed );
			} else {
				if ( config.licensing.defaultType.toLowerCase() === deed.name ) {
					chooser.onLayoutReady = chooser.selectDeed.bind( chooser, deed );
				}
				radio.on( 'choose', function () {
					chooser.selectDeed( deed );
				} );
			}
		} );

		// deselect all deeds
		this.deselectDeedInterface( this.$selector.find( '.mediauploader-deed' ) );
	};

	mw.UploadWizardDeedChooser.prototype = {
		/**
		 * How many deed choosers there are (important for creating unique ids, element names)
		 */
		widgetCount: 0,

		/**
		 * Check if this form is filled out correctly.
		 *
		 * @return {boolean} true if valid, false if not
		 */
		valid: function () {
			return !!this.deed;
		},

		/**
		 * Uploads this deed controls
		 */
		uploads: [],

		selectDeed: function ( deed ) {
			var $deedInterface = this.$selector.find( '.mediauploader-deed.mediauploader-deed-' + deed.name );

			this.choose( deed );
			this.selectDeedInterface( $deedInterface );
			$deedInterface.find( 'span.mediauploader-deed-header input' ).prop( 'checked', true );
		},

		choose: function ( deed ) {
			var chooser = this;

			this.deed = deed;

			this.uploads.forEach( function ( upload ) {
				upload.deedChooser = chooser;
			} );

			// eslint-disable-next-line no-jquery/no-global-selector
			$( '#mediauploader-stepdiv-deeds .mediauploader-button-next' ).show();
		},

		/**
		 * From the deed choices, make a choice fade to the background a bit, hide the extended form
		 *
		 * @param {jQuery} $deedSelector
		 */
		deselectDeedInterface: function ( $deedSelector ) {
			$deedSelector.removeClass( 'selected' );
			$deedSelector.find( '.mediauploader-deed-form' ).each( function () {
				var $form = $( this );
				// Prevent validation of deselected deeds by disabling all form inputs
				// TODO: Use a tag selector
				// eslint-disable-next-line no-jquery/no-sizzle
				$form.find( ':input' ).prop( 'disabled', true );
				// eslint-disable-next-line no-jquery/no-sizzle
				if ( $form.parents().is( ':hidden' ) ) {
					$form.hide();
				} else {
					// FIXME: Use CSS transition
					// eslint-disable-next-line no-jquery/no-slide
					$form.slideUp( 500 );
				}
			} );
		},

		/**
		 * From the deed choice page, show a particular deed
		 *
		 * @param {jQuery} $deedSelector
		 */
		selectDeedInterface: function ( $deedSelector ) {
			var $otherDeeds = $deedSelector.siblings().filter( '.mediauploader-deed' );
			this.deselectDeedInterface( $otherDeeds );
			// FIXME: Use CSS transition
			// eslint-disable-next-line no-jquery/no-fade
			$deedSelector.addClass( 'selected' ).fadeTo( 'fast', 1.0 );
			$deedSelector.find( '.mediauploader-deed-form' ).each( function () {
				var $form = $( this );
				// (Re-)enable all form inputs
				// TODO: Use a tag selector
				// eslint-disable-next-line no-jquery/no-sizzle
				$form.find( ':input' ).prop( 'disabled', false );
				// eslint-disable-next-line no-jquery/no-sizzle
				if ( $form.is( ':hidden' ) ) {
					// if the form was hidden, set things up so a slide-down works
					// FIXME: Use CSS transition
					// eslint-disable-next-line no-jquery/no-slide
					$form.show().slideUp( 0 );
				}
				// FIXME: Use CSS transition
				// eslint-disable-next-line no-jquery/no-slide
				$form.slideDown( 500 );
			} );
		},

		remove: function () {
			this.$selector.html( '' );
		},

		/**
		 * @return {Object}
		 */
		getSerialized: function () {
			return this.valid() ? this.deed.getSerialized() : {};
		},

		/**
		 * @param {Object} serialized
		 */
		setSerialized: function ( serialized ) {
			var deed;

			if ( serialized.name && serialized.name in this.deeds ) {
				deed = this.deeds[ serialized.name ];
				deed.setSerialized( serialized );
				this.selectDeed( deed );
			}
		}

	};

}() );