MediaWiki:Gadget-common-special-block.js

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
JS-код ниже относится к скрытому гаджету common-special-block. Связанный CSS-файл: MediaWiki:Gadget-common-special-block.css. Он включён по умолчанию.

После сохранения или недавних изменений очистите кэш браузера.

// Не удаляйте проверку на название подстраницы
( function() {
	if ( mw.config.get( 'wgCanonicalSpecialPageName' ) !== 'Block' ) {
		return;
	}
	
	mw.hook( 'wikipage.content' ).add( function () {
		// Подсветка изменившихся элементов
		$.fn.highlight = function () {
			$( this ).addClass( 'highlighted' );
			setTimeout( function () {
				$( '.highlighted' ).removeClass( 'highlighted' );
			}, 1000 );
		};
		
		// Получить элемент ввода MediaWiki / установить его значение
		function elem( name, value ) {
			var $el = $( '[name="wp' + name + '"]' );
			if ( value !== undefined ) {
				// Устанавливаем значение
				if ( $el.prop( 'tagName' ) === 'SELECT' ) {
					var $option = $el.find( 'option[value*="' + value + '"]' );
					if ( $option.prop( 'selected' ) !== !!value ) {
						$option.prop( 'selected', true ).end().change();
						$el.highlight();
					}
				} else if ( $el.attr( 'type' ) === 'checkbox' ) {
					if ( $el.prop( 'checked' ) !== !!value ) {
						$el.prop( 'checked', value );
						$el.highlight();
					}
				} else {  // type = text
					if ( /-other$/.test( name ) ) {
						// Устанавливаем значение «родительского» выпадающего списка — «other»
						elem( name.replace( /-other$/ , ''), 'other' );
					}
					if ( $el.val() !== value ) {
						$el.val( value );
						$el.highlight();
					}
				}
			}
			return $el;
		}
		
		elem( 'Reason' ).change( function () {
			if ( /неприемлемое имя/.test( this.value ) ) {
				elem( 'Expiry' , 'indefinite' );
				if ( /рекламное|заблуждение/.test( this.value ) ) {
					elem( 'CreateAccount', false );
					elem( 'DisableEmail', false );
					elem( 'AutoBlock', false );
				}
			} else if ( /анонимизирующий сервер/.test( this.value ) ) {
				// Если значение не установлено
				if ( elem( 'Expiry' ).val() === 'other' && !elem( 'Expiry-other' ).val() ) {
					elem( 'Expiry-other', '5 years' );
				}
				elem( 'CreateAccount', true );
				elem( 'DisableEmail', true );
				elem( 'HardBlock', true );
			} else if ( /новый участник с провокационным вкладом/.test( this.value )
				|| /«общая» учётная запись/i.test( this.value )
			) {
				elem( 'Expiry', 'indefinite' );
			}
		} );
		
	} );
		
	// https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
	// Если изменение состояния эмуляции селекта в OOjs UI будет само инициировать событие change
	// на настоящем селекте, кусок до runAsEarlyAsPossible включительно можно будет удалить.
	var observe = function () {
		var label = $( '#mw-input-wpReason-select .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label' )[ 0 ];
		if ( label && typeof MutationObserver === 'function' ) {
			var observer = new MutationObserver( function ( mutations ) {
				mutations.forEach( function ( mutation ) {
					if ( mutation.addedNodes.length ) {
						elem( 'Reason' ).change();
					}
				} );
			} );
			observer.observe( label, { childList: true } );
		}
	};
	
	runAsEarlyAsPossible(
		observe,
		$( '#mw-input-wpReason-select .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label' ),
		function () {
			setTimeout( observe, 2000 );
		}
	);
}() );