MediaWiki:Gadget-wikibugs-core.js: различия между версиями
Перейти к навигации
Перейти к поиску
Содержимое удалено Содержимое добавлено
Stjn (обсуждение | вклад) адаптивность для предупреждения о соцсетях |
Stjn (обсуждение | вклад) дублировать ссылку в новом Векторе в меню Инструменты |
||
Строка 338: | Строка 338: | ||
} ); |
} ); |
||
}; |
}; |
||
// Re-use the handler on multiple targets |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
} |
|||
// Click event |
// Click event |
||
$( function() { |
$( function() { |
||
var link = document.querySelector( '#n-bug_in_article a' ); |
var link = document.querySelector( '#n-bug_in_article a' ); |
||
⚫ | |||
$( 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 || mw.config.get( 'skin' ) === 'vector-2022' ) { |
|||
var id = 'n-bug_in_article'; |
var id = 'n-bug_in_article'; |
||
var href = |
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 ); |
|||
} |
} |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
} ); |
} ); |
||
Версия от 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 ) );