MediaWiki:Gadget-wikibugs-core.js: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Содержимое удалено Содержимое добавлено
адаптивность для предупреждения о соцсетях
дублировать ссылку в новом Векторе в меню Инструменты
Строка 338: Строка 338:
} );
} );
};
};
// Re-use the handler on multiple targets
var wb$onClick = function ( e ) {
e.preventDefault();
mw.loader.using( [
'mediawiki.api',
'oojs-ui-core',
'oojs-ui-widgets',
'oojs-ui-windows'
] ).then( wb$popWikibug );
}


// Click event
// Click event
$( function() {
$( function() {
var link = document.querySelector( '#n-bug_in_article a' );
var link = document.querySelector( '#n-bug_in_article a' );
if ( link ) {
$( link ).on( 'click', wb$onClick );
}
// If the link hasn't been added in the sidebar, then create a new link
// If the link hasn't been added in the sidebar, then create a new link
// For discoverability also add a toolbox link to new Vector
if ( !link ) {
if ( !link || mw.config.get( 'skin' ) === 'vector-2022' ) {
var id = 'n-bug_in_article';
var id = 'n-bug_in_article';
var href = mw.util.getUrl('Википедия:Сообщения_об_ошибках');
var href = wb$link( 'Википедия:Сообщения_об_ошибках' );
var textContent = mw.msg( 'bug_in_article' );
var textContent = mw.msg( 'bug_in_article' );
// prefer the toolbox (available to logged in users)
// prefer the toolbox (available to logged in users)
Строка 354: Строка 369:
link.textContent = textContent;
link.textContent = textContent;
link.href = href;
link.href = href;
var content = document.getElementById('mw-content-text');
var content = document.getElementById( 'mw-content-text' );
if ( content ) {
if ( content ) {
content.appendChild( link );
content.appendChild( link );
}
}
}
}
$( link ).on( 'click', wb$onClick );
}
}
$( link ).on( 'click', function ( e ) {
e.preventDefault();
mw.loader.using( [
'mediawiki.api',
'oojs-ui-core',
'oojs-ui-widgets',
'oojs-ui-windows'
] ).then( wb$popWikibug );
} );
} );
} );



Версия от 20:14, 1 февраля 2024

/*
 * Original version: https://pl.wikipedia.org/wiki/MediaWiki:Wikibugs.js (2008-12-17)
 * Russian version by [[User:Александр Сигачёв]], [[User:Putnik]], [[User:LEMeZza]]
 * Converted to OOjs (2017-05-20) by [[User:Putnik]]
 */
( function ( mw, $ ) {
	//'use strict';
	// Works around https://phabricator.wikimedia.org/T238386
	mw.messages.set( 'bug_in_article', 'Сообщить об ошибке' );
	// Except VK, Odnoklassniki and Facebook
	if ( mw.config.get( 'wgArticleId' ) === 639373 ||
		mw.config.get( 'wgArticleId' ) === 932117 ||
		mw.config.get( 'wgArticleId' ) === 1297302 ||
		mw.config.get( 'wgArticleId' ) === 25133866
	) {
		return;
	}

	var wb$bugsPage = 'Википедия:Сообщения об ошибках';
	var wb$badPages = [
		'Википедия:Контакты',
		'Википедия:Сообщения об ошибках',
		'Заглавная страница'
	];

	var wb$link = function ( page ) {
		return mw.config.get( 'wgArticlePath' ).replace( /\$1/, page.replace( / /g, '_' ) );
	};

	var wb$i18n = {
		nsFile: 'Файл:',
		nsSpecial: 'Служебная:',
		nsCat: 'Категория:',
		title: 'Сообщение об ошибке',
		btnFix: 'Исправить самостоятельно',
		btnReport: 'Сообщить об ошибке',
		btnCancel: 'Закрыть',
		btnSend: 'Отправить',
		fldPage: 'Название страницы',
		fldText: 'Текст сообщения',
		fldTextInfo: 'Пожалуйста, опишите ошибку как можно точнее. При сообщении' +
			' о\u00A0фактической ошибке не забудьте указать источник, подтверждающий' +
			' вашу информацию.',
		fldCaptcha: 'Проверочный код',
		fldSign: 'Подпись',
		fldSignIP: 'будет указан ваш IP-адрес',
		alertShort: 'Описание ошибки слишком коротко. Пожалуйста, расширьте его.',
		alertNoPage: 'Введите имя страницы.',
		alertCaptcha: 'В вашем тексте содержатся внешние ссылки. Пожалуйста,' +
			' введите код с изображения и отправьте сообщение ещё раз.',
		alertError: 'При отправке произошла ошибка. Попробуйте ещё раз.',
		msgSign: '\n\nАвтор сообщения:',
		newTopic: 'новая тема',
		htmlIpWarn: '<strong>Внимание.</strong> Ваш IP-адрес будет записан в журнал' +
			' изменений страницы.',
		htmlInfo: '<div class="wikibugs-social-warning">\
				<p><strong>Не\u00A0сообщайте</strong> об\u00A0ошибках на\u00A0других\
					сайтах (например, <strong>«ВКонтакте»</strong> или\
					<strong>«Одноклассники»</strong>), они будут проигнорированы.</p>\
				<p>Отсутствие статьи в\u00A0Википедии\u00A0— не\u00A0ошибка, вы можете оставить\
					<a href="' + wb$link( 'Википедия:К созданию' ) + '">запрос на её создание</a>.</p>\
			</div>\
			<p>Если вы заметили ошибку в\u00A0Википедии,\
				пожалуйста, исправьте её самостоятельно, используемая на\u00A0этом\
				сайте технология <a href="' + wb$link( 'вики' ) + '">вики</a>\
				позволяет это сделать.\
				Не\u00A0смущайтесь, одно из\u00A0правил Википедии гласит:\
				«<a href="' + wb$link( 'Википедия:Правьте смело' ) + '">Правьте смело</a>»!\
				Если вы не\u00A0можете исправить ошибку самостоятельно, сообщите\
				о\u00A0ней с\u00A0помощью данной формы.</p><p><strong>Если ошибка\
				уже исправлена\u00A0— не\u00A0сообщайте о\u00A0ней.</strong></p>\
			<p>Не\u00A0оставляйте свой телефон и/или электронный адрес, ответ\
				на\u00A0сообщение будет дан только на\u00A0странице\
				с\u00A0сообщениями и нигде больше.</p>\
			<p><a href="' + wb$link( wb$bugsPage ) + '">Текущий\
				список сообщений об ошибках</a></p>'
	};

	var wb$isValidPageName = function (name) {
		if ( !name || name.substr( 0, name.indexOf( ':' ) + 1 ) === wb$i18n.nsSpecial ) {
			return false;
		}
		name = name.replace( /_/g, ' ' );
		for ( var i = 0; i < wb$badPages.length; i++ ) {
			if ( name === wb$badPages[i] ) {
				return false;
			}
		}

		return true;
	};

	var wb$popWikibug = function () {
		// Prepare messages
		var $infoHtml = $( '<div>' ).html( $.parseHTML( wb$i18n.htmlInfo ) );
		if ( !mw.config.get( 'wgUserName' ) ) {
			$infoHtml.prepend( $( '<p>' ).html( $.parseHTML( wb$i18n.htmlIpWarn ) ) );
		}

		// OOjs window
		var windowManager = new OO.ui.WindowManager();
		var infoDialog = new OO.ui.MessageDialog();
		var pageActions = [
			{ label: wb$i18n.btnReport, action: 'report', flags: 'progressive' },
			{ label: wb$i18n.btnCancel },
		];
		if ( mw.config.get( 'wgIsProbablyEditable' ) ) {
			pageActions.unshift( { label: wb$i18n.btnFix, action: 'edit', flags: 'progressive' } );
		}
		$( 'body' ).append( windowManager.$element );
		windowManager.addWindows( [ infoDialog ] );
		windowManager.openWindow( infoDialog, {
			title: wb$i18n.title,
			message: $infoHtml,
			actions: pageActions,
			size: 'large',
		} ).then( function ( opened ) {
			opened.then( function ( closing, data ) {
				if ( data && data.action === 'edit' ) {
					// Go to edit page
					var $editLink = $( mw.config.get( 'skin' ) === 'minerva' ? '#ca-edit' : '#ca-edit a' ),
						editUrl = mw.config.get( 'wgArticlePath' ).replace( /\$1/, wb$bugsPage );
					if ( $editLink.length ) {
						editUrl = $editLink.attr( 'href' );
					}
					window.location.assign( editUrl );

				} else if ( data && data.action === 'report' ) {
					// Prepare form
					var inputPage = new OO.ui.TextInputWidget( {
						placeholder: wb$i18n.fldPage,
						value: mw.config.get( 'wgPageName' ).replace( /_/g, ' ' ),
						disabled: wb$isValidPageName( mw.config.get( 'wgPageName' ) ) && !mw.config.get( 'wgNamespaceNumber' ),
					} );

					var inputText = new OO.ui.MultilineTextInputWidget( {
						placeholder: wb$i18n.fldTextInfo,
						rows: 5
					} );

					var inputCaptcha = new OO.ui.TextInputWidget( {
						placeholder: wb$i18n.fldCaptcha,
					} );

					var panelCaptcha = new OO.ui.FieldLayout( inputCaptcha, {
						label: wb$i18n.fldCaptcha,
					} );
					panelCaptcha.toggle( false );

					var imageCaptcha = new OO.ui.ToggleWidget();
					imageCaptcha.$element.css( 'text-align', 'right' );
					imageCaptcha.$element.append( $( '<img>' )
						.attr( 'id', 'wikibugs-captcha-img' )
						.attr( 'width', 249 )
						.attr( 'height', 63 ) );
					imageCaptcha.toggle( false );

					var inputSign = new OO.ui.TextInputWidget( {
						placeholder: wb$i18n.fldSign,
						value: mw.config.get( 'wgUserName' ) || wb$i18n.fldSignIP,
						disabled: true
					} );

					var fieldset = new OO.ui.FieldsetLayout( {
						classes: [ 'container' ],
					} );

					fieldset.addItems( [
						new OO.ui.FieldLayout( inputPage, {
							label: wb$i18n.fldPage,
							align: 'top'
						} ),
						new OO.ui.FieldLayout( inputText, {
							label: wb$i18n.fldText,
							align: 'top'
						} ),
						panelCaptcha,
						imageCaptcha,
						new OO.ui.FieldLayout( inputSign, {
							label: wb$i18n.fldSign,
						} ),
					] );

					// Add the FieldsetLayout to a FormLayout.
					var form = new OO.ui.FormLayout( {
						items: [ fieldset ],
					} );

					// Open window with report form
					function ReportDialog( config ) {
						ReportDialog.parent.call( this, config );
					}
					OO.inheritClass( ReportDialog, OO.ui.MessageDialog );
					ReportDialog.static.name = 'reportDialog';
					ReportDialog.prototype.getActionProcess = function ( action ) {
						var dialog = this;
						if ( action ) {
							return new OO.ui.Process( function () {
								if ( action === 'send' ) {
									dialog.getActions().setAbilities({ send: false });
									
									// Send message
									var content = inputText.getValue();
									if ( content === '' || content.length < 20 || !content.match( ' ' ) ) {
										mw.notify( wb$i18n.alertShort );
										inputText.focus();
										dialog.getActions().setAbilities({ send: true });
										return;
									}

									var page = inputPage.getValue()
											.replace( /^https?:\/\/ru\.wikipedia\.org\/wiki\/(.+)$/, '$1' )
											.replace( /_/g, ' ' );
									page = decodeURIComponent( page );

									var section;

									if ( page === mw.config.get( 'wgPageName' ).replace( /_/g, ' ' ) &&
										wb$isValidPageName( mw.config.get( 'wgPageName' ) )
									) {
										if ( mw.config.get( 'wgNamespaceNumber' ) === 6 ) {
											section = '[[:' + wb$i18n.nsFile + mw.config.get( 'wgTitle' ) + '|' + window.wgTitle + ']]';
											content = '[[' + wb$i18n.nsFile + mw.config.get( 'wgTitle' ) +
													'|thumb|left|100px]]\n* ' + content + '\n{{clear}}';
										} else {
											var re = new RegExp( '^('+ wb$i18n.nsCat + '|'+ wb$i18n.nsFile + '|\\/)' );
											section = page.replace( re, ':$1' );
											section = '[[' + section + ']]';
										}
									} else {
										page = page
											.replace( /\[\[([^\[\]\|]+)\|[^\[\]\|]+\]\]/g, '$1' )
											.replace( /[\[\]\|]/g, '' )
											.replace( /^\s+/g, '' )
											.replace( /\s+$/g, '' );

										if ( !wb$isValidPageName( page ) ) {
											mw.notify( wb$i18n.alertNoPage );
											if ( wb$isValidPageName( mw.config.get( 'wgPageName' ) ) ) {
												inputPage.setValue( mw.config.get( 'wgPageName' ) );
											} else {
												inputPage.setValue( '' );
												inputPage.focus();
											}
											dialog.getActions().setAbilities({ send: true });
											return;
										}
										if ( page.indexOf( ':' ) > 0 ) {
											section = '[[:' + page + ']]';
										} else {
											section = '[[' + page + ']]';
										}
									}

									content += wb$i18n.msgSign;
									content += ' ~~' + '~~';

									dialog.getActions().get()[0].pushPending();

									var data = {
										format: 'json',
										action: 'edit',
										title: wb$bugsPage,
										section: 'new',
										sectiontitle: section,
										summary: '/* ' + page + ' */ ' + wb$i18n.newTopic,
										text: content.trim(),
										token: mw.user.tokens.get( 'csrfToken' )
									};
									var captchaId = $( '#wikibugs-captcha-img' ).data( 'id' );
									if ( captchaId ) {
										data.captchaid = captchaId;
										data.captchaword = inputCaptcha.getValue().trim();
									}

									$.ajax( {
										url: '/w/api.php',
										type: 'POST',
										data: data,
										success: function ( xhr ) {
											if ( xhr && xhr.edit && xhr.edit.result === 'Success' ) {
												// Success
												var url = mw.config.get( 'wgArticlePath' )
														.replace( /\$1/, wb$bugsPage )
														.replace( / /g, '_' );
												page = page.replace( / /g, '_' );
												window.location.href = url + '#' + page;
											} else if ( xhr &&
												xhr.edit &&
												xhr.edit.captcha &&
												xhr.edit.captcha.type === 'image'
											) {
												// Captcha
												$( '#wikibugs-captcha-img' )
													.attr( 'src', xhr.edit.captcha.url )
													.data( 'id', xhr.edit.captcha.id );
												imageCaptcha.toggle( true );
												inputCaptcha.setValue( '' );
												panelCaptcha.toggle( true );
												dialog.getActions().get()[0].popPending();
												mw.notify( wb$i18n.alertCaptcha );
												dialog.getActions().setAbilities({ send: true });
											} else {
												// Error
												dialog.getActions().get()[0].popPending();
												mw.notify( wb$i18n.alertError );
												dialog.getActions().setAbilities({ send: true });
											}
										},
										error: function() {
											dialog.getActions().get()[0].popPending();
											mw.notify( wb$i18n.alertError );
											dialog.getActions().setAbilities({ send: true });
										}
									} );
								} else {
									dialog.close();
								}
							} );
						}
						return ReportDialog.parent.prototype.getActionProcess.call( this, action );
					};

					var reportDialog = new ReportDialog();
					windowManager.addWindows( [ reportDialog ] );

					windowManager.openWindow( reportDialog, {
						title: wb$i18n.title,
						message: form.$element,
						actions: [
							{ label: wb$i18n.btnSend, action: 'send', flags: 'progressive' },
							{ label: wb$i18n.btnCancel },
						],
						size: 'medium',
					} );
				}
			} );
		} );
	};
	
	// Re-use the handler on multiple targets
	var wb$onClick = function ( e ) {
		e.preventDefault();
		mw.loader.using( [
			'mediawiki.api',
			'oojs-ui-core',
			'oojs-ui-widgets',
			'oojs-ui-windows'
		] ).then( wb$popWikibug );
	}

	// Click event
	$( function() {
		var link = document.querySelector( '#n-bug_in_article a' );
		if ( link ) {
			$( link ).on( 'click', wb$onClick );
		}
		// If the link hasn't been added in the sidebar, then create a new link
		// For discoverability also add a toolbox link to new Vector
		if ( !link || mw.config.get( 'skin' ) === 'vector-2022' ) {
			var id = 'n-bug_in_article';
			var href = wb$link( 'Википедия:Сообщения_об_ошибках' );
			var textContent = mw.msg( 'bug_in_article' );
			// prefer the toolbox (available to logged in users)
			link = mw.util.addPortletLink( 'p-tb', href, textContent, id );
			// but if no toolbox (e.g. anonymous user, add to end of article)
			if ( !link ) {
				link = document.createElement( 'a' );
				link.textContent = textContent;
				link.href = href;
				var content = document.getElementById( 'mw-content-text' );
				if ( content ) {
					content.appendChild( link );
				}
			}
			$( link ).on( 'click', wb$onClick );
		}
	} );

}( mediaWiki, jQuery ) );