לדלג לתוכן

מדיה ויקי:Gadget-wikibugs.js

מתוך ויקיפדיה, האנציקלופדיה החופשית

הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
/*
From [[pl:MediaWiki:Gadget-wikibugs.js]]:
 * @author: [[:pl:User:Dodek]] (idea and text)
 * @author: [[:pl:User:Adziura]] (idea and text)
 * @author: [[:pl:User:Nux]] (implementation)
 * @author: [[:pl:User:Saper]] (implementation)
 * @author: [[:pl:User:Beau]] (implementation)
 * @author: [[:pt:User:Helder.wiki]] (implementation)
 
Adaptation for hewiki:
 * @author: [[User:ערן]]
 */
 
mw.messages.set( {
	'wikibugs-dialog-title': 'דיווח על טעות',
	'wikibugs-open-form-button': 'דיווח לעורכים',
	'wikibugs-edit-page-button': 'עריכת הדף',
	'wikibugs-cancel-button': 'ביטול',
	'wikibugs-submit-report-button': 'שליחה',
	'wikibugs-ip-address-notice': '<b>שימו לב:</b> כתובת ה־IP שלכם תירשם בהיסטוריית העריכות של הדף.',
	'wikibugs-page-name-label': 'שם הדף:',
	'wikibugs-report-content-label': '<br/>פרטי הבעיה:',
	'wikibugs-report-content-placeholder': 'תארו את הבעיה בבירור.',
	'wikibugs-report-source-placeholder': 'אם ניתן, ציינו מקור חיצוני שתומך בדבריכם.',
	'wikibugs-signature-label': 'חתימה:',
	'wikibugs-edit-error': '',
	'wikibugs-token-error': '',
	'wikibugs-unknown-token-error': '',
	'wikibugs-ajax-error': 'ארעה שגיאה בשליחת הדיווח. אנא נסו שנית.',
	'wikibugs-incomplete-information': 'תארו בפירוט את הבעיה. התיאור שסיפקתם קצר מדי.',
	'wikibugs-invalid-page': 'יש למלא את השם.',
	'wikibugs-reported-by': 'דווח על ידי: $1',
	'wikibugs-bad-reports-text': '<p>טופס זה <b>אינו מיועד</b> לבקשת ערכים או תוכן חסר. ' +
		'במקרה שברצונכם לבקש הוספת תכנים פנו ל:</p><ul>' +
		'<li><a href="' + mw.util.getUrl( 'ויקיפדיה:בקשת ערך' ) + '">' +
		'דף בקשת ערכים</a></li></ul><p>לפנייה לעורכים או בקשות אחרות פנו ל: </p>' +
		'<ul><li><a href="' + mw.util.getUrl( 'ויקיפדיה:ספר אורחים' ) + '">ספר האורחים</a></li></ul>',
	'wikibugs-article-intro': '<p style="margin-top:0px;">באפשרותכם לדווח כאן על טעות בערכי ויקיפדיה. ' +
		'שימו לב שכל אחד יכול לערוך כמעט כל דף בוויקיפדיה – אנו ממליצים שתנסו <b>לתקן את הטעות בעצמכם</b> ולציין מקור שמאשר את המידע המתוקן. ' +
		'אם אתם חוששים לערוך בעצמכם, או שאינכם מסתדרים עם ממשק העריכה, ניתן גם לדווח על הטעות לעורכים.</p>',
	'wikibugs-image-intro': '<p style="margin-top:0px;">באפשרותכם לדווח על קבצים מפרי זכויות יוצרים, ' +
		' קבצים בגרסה טובה יותר בוויקשיתוף או על טעויות בתיאור התמונה.</p>' +
		'<p><b>אנא נסו לתקן זאת בעצמכם במידת האפשר.</b></p>',
	'wikibugs-already-reported-notice': '<p><b>ראו גם:</b> <ul>' +
		'<li><a href="' + mw.util.getUrl( 'ויקיפדיה:דיווח על טעויות' ) + '">' +
		'דף הדיווח על טעויות בוויקיפדיה</a> </li>' +
		'<li><a href="' + mw.util.getUrl( 'ויקיפדיה:דיווח על טעויות' ) + '?action=history">' +
		'דף היסטוריית דיווחים על טעויות</a></li></ul>',
	'wikibugs-footer': '',
	'wikibugs-new-report': 'נושא חדש: $1',
	'wikibugs-new-report-talk-title': 'דיווח על טעות',
	'wikibugs-new-report-talk-content': 'נוסף דיווח על טעות בערך [[ויקיפדיה:דיווח על טעויות|כאן]]. ~~'+'~~',
	'wikibugs-new-report-summary-prefix': 'דיווח על טעות',
	'wikibugs-new-report-summary-suffix': 'דיווח חדש',
	'wikibugs-report-source-subtitle': 'מקור'
} );
 
 
window.wikiBugsGadget = {
	/**
	 * Version number of this gadget.
	 */
	version: 9,
	/**
	 * A name of a page where reports are saved.
	 */
	reportPage: 'ויקיפדיה:דיווח על טעויות',
	/**
	 * Black list of pages which reports should not refer to.
	 */
	badPages: [
		'ויקיפדיה:דיווח על טעויות'
		],
	/**
	 * Define pages where it's not needed or tends to encourage submission of large
	 * volumes of unrelated errors; instead, these load CSS which hides the "Report A Bug" link
	 */
	excludedPages: [
		'עמוד ראשי'
		],
	/**
	 * Message shown on pages in the main namespace.
	 */
	articleIntro: '<div id="wbBadReports">' +
		mw.msg( 'wikibugs-bad-reports-text' ) + '</div>' +
		mw.msg( 'wikibugs-article-intro' ) +
		mw.msg( 'wikibugs-already-reported-notice' ) +
		mw.msg( 'wikibugs-footer' ),
	/**
	 * Message shown on pages in the file namespace.
	 */
	imageIntro: '<div id="wbBadReports">' +
		mw.msg( 'wikibugs-bad-reports-text' ) + '</div>' +
		mw.msg( 'wikibugs-image-intro' ) +
		mw.msg( 'wikibugs-already-reported-notice' ) +
		mw.msg( 'wikibugs-footer' ),
 
	/**
	 * Checks if a title of the page is valid for a report.
	 * @param title A title of the page.
	 */
	isValidPageName: function( title ) {
		// Empty title is not valid
		if ( title === '' ) {
			return false;
		}
		// Special pages are not valid too
		if ( this.getPageNamespaceNumber( title ) === -1 ) {
			return false;
		}
		// Check black list
		title = this.getRefinedPageName( title );
		return jQuery.inArray( title, this.badPages ) === -1;
	},
 
	/**
	 * Returns a namespace number of a specifed page.
	 * @param title A title of the page.
	 */
	getPageNamespaceNumber: function( title ) {
		var matches = title.match( /^([^:]+)/ );
		if ( matches ) {
			var key = matches[1].toLowerCase();
			var namespaces = mw.config.get( 'wgNamespaceIds' );
			var result = namespaces[key];
			if ( result !== null ) {
				return result;
			}
		}
		return 0;
	},
 
	/**
	 * Returns a refined page title.
	 * @param title A title of the page.
	 */
	getRefinedPageName: function( title ) {
		return jQuery.trim( title.replace( /_/g, ' ' ) );
	},
 
	/**
	 * Sets up the gadget.
	 */
	init: function() {
		var that = this;
		var excluded = false;
 
		// Special pages and MediaWiki pages are excluded
		if ( jQuery.inArray( mw.config.get( 'wgNamespaceNumber' ), [-1, 8] ) > -1 ) {
			excluded = true;
		} else {
			var name = this.getRefinedPageName( mw.config.get( 'wgPageName' ) );
			excluded = jQuery.inArray( name, this.excludedPages ) !== -1;
		}
 
		// FIXME: This doesn't exists on "standard", "cologneblue" (no ids) and "nostalgia" (no sidebar)
		var $articleBugLink = jQuery( '.n-bug_in_article' );
		var $imageBugLink = jQuery( '#n-bad-image' );
 
		if ( excluded ) {
			// Hide the links
			$articleBugLink.hide();
			$imageBugLink.hide();
			return;
		}
 
		$articleBugLink.find( 'a' )
			.attr( 'href', '#' )
			.click( function( event ) {
				that.open( mw.config.get( 'wgNamespaceNumber' ) == 6? that.imageIntro: that.articleIntro );
				event.preventDefault();
			} );
 
		// Link on the report-an-error page itself
		jQuery( '#report-bug-link a' ).click( function( event ) {
			that.open( that.articleIntro );
			event.preventDefault();
		} );
	},
 
	/**
	 * Redirects to the edit page.
	 */
	goToEditPage: function() {
		var $editLink = jQuery( '#ca-ve-edit' ).find( 'a' );
		if ( $editLink.length === 0 ) $editLink = jQuery( '#ca-edit' ).find( 'a' ); //fallback
		window.location = $editLink.attr( 'href' ) || mw.util.getUrl( this.reportPage );
	},
 
	/**
	 * Shows the dialog window.
	 * @param infoHtml The message content.
	 */
	open: function( infoHtml ) {
		var that = this;
 
		var can_edit = document.getElementById( 'ca-edit' ) ? true : false;
 
		var $dialog = jQuery( '<div id="dialogContent"></div>' ).append( infoHtml );
		var api = new mw.Api();
		api.get({
		  action: 'parse',
			page: 'תבנית:הודעת עריכה/דף/' + mw.config.get('wgPageName'),
			prop: 'text'
		}).done( function( res ) {
			if ( res && res.parse && res.parse.text ) {
				$dialog.append(res.parse.text['*']);
			}
		});

		if ( mw.user.isAnon() ) {
			$dialog.append( '<p>' + mw.msg( 'wikibugs-ip-address-notice' ) + '</p>' );
		}
 
		var buttons = {};
		buttons[mw.msg( 'wikibugs-cancel-button' )] = function() {
			jQuery( this ).dialog( 'close' );
		};
		buttons[mw.msg( 'wikibugs-open-form-button' )] = function() {
			that.openForm( this );
		};
		if ( can_edit ) {
			buttons[mw.msg( 'wikibugs-edit-page-button' )] = function() {
				that.goToEditPage();
			};
		}
 
		$dialog.dialog( {
			width: 700,
			height: 500,
			modal: true,
			resizable: false,
			draggable: true,
			closeOnEscape: true,
			dialogClass: 'reportBugDialog',
			title: mw.msg( 'wikibugs-dialog-title' ),
			close: function() {
				jQuery( this ).dialog( 'destroy' ).remove();
			},
			buttons: buttons
		} );
		jQuery( 'div.reportBugDialog button:last' ).focus();
	},
	/**
	 * Shows the form in the dialog window.
	 */
	openForm: function( dialog ) {
		var that = this;
 
		jQuery( '#dialogContent' ).empty().append(
			'<form name="WikibugForm" enctype="multipart/form-data">' +
			'<fieldset>' +
			'<label for="wbPageTitle">' + mw.msg( 'wikibugs-page-name-label' ) + '</label>' +
			'<input id="wbPageTitle" type="text" name="wbPageTitle" class="text ui-widget-content ui-corner-all" />' +
			'<label for="wbText">' + mw.msg( 'wikibugs-report-content-label' ) + '</label>' +
			'<textarea id="wbText" name="wbText" rows="6" class="text ui-widget-content ui-corner-all">' +
			mw.msg( 'wikibugs-report-content-placeholder' ) + '</textarea>' +
			'<textarea id="wbTextSource" name="wbTextSource" rows="2" class="text ui-widget-content ui-corner-all">' +
			mw.msg( 'wikibugs-report-source-placeholder' ) + '</textarea>' +
			'<label for="wbAuthor">' + mw.msg( 'wikibugs-signature-label' ) + '</label>' +
			'<input id="wbAuthor" type="text" class="text ui-widget-content ui-corner-all"/>' +
			'</fieldset>' +
			'<img id="wikibugs-loading-icon" src="//upload.wikimedia.org/wikipedia/commons/4/49/Linux_Ubuntu_Loader.gif" style="display:none;"/>' +
			'</form>'
		);
 
		var buttons = {};
		buttons[mw.msg( 'wikibugs-cancel-button' )] = function() {
			jQuery( this ).dialog( 'close' );
		};
		buttons[mw.msg( 'wikibugs-submit-report-button' )] = function() {
			that.submitForm();
		};
 
		jQuery( dialog ).dialog( 'option', 'buttons', buttons );
 
		jQuery( '#wbText' ).focus( function() {
			if ( this.value === mw.msg( 'wikibugs-report-content-placeholder' ) ) {
				this.value = '';
			}
		} );
		jQuery( '#wbTextSource' ).focus( function() {
			if ( this.value === mw.msg( 'wikibugs-report-source-placeholder' ) ) {
				this.value = '';
			}
		} );

		if ( this.isValidPageName( mw.config.get( 'wgPageName' ) ) ) {
			jQuery( '#wbPageTitle' ).val( this.getRefinedPageName( mw.config.get( 'wgPageName' ) ) );
		}
 
		if ( !mw.user.isAnon() ) {
			var author = document.getElementById( 'wbAuthor' );
			author.value = '~~' + '~~';
			author.disabled = 'disabled';
		}
	},
 
	/**
	 * Indicates wheter submit should be ignored.
	 */
	suppressSubmit: false,
 
	/**
	 * Sends the contents of the form.
	 */
	submitForm: function() {
		if ( this.suppressSubmit ) {
		    return;
		}
 
		var form = document.forms.WikibugForm;
		var content = form.wbText.value;
		var source = form.wbTextSource.value;
		if ( content === mw.msg( 'wikibugs-report-content-placeholder' ) ||
		    content.length < 20 ||
		    !content.match( ' ' ) ) {
			// Description too short or unchanged
			alert( mw.msg( 'wikibugs-incomplete-information' ) );
 
			form.wbText.focus();
			return;
		}
		content = jQuery.trim( content );

		if ( ( source !== mw.msg( 'wikibugs-report-source-placeholder' ) ) && source.length ) {
			content += '\n\n'+ mw.msg( 'wikibugs-report-source-subtitle' )+': ' + jQuery.trim( source ) + ';'
		}
 
		// Append a signature to the report
		if ( !mw.user.isAnon() ) {
			content += '\n\n' + mw.msg( 'wikibugs-reported-by', '~~' + '~~' );
		} else {
			content += '\n\n' + mw.msg( 'wikibugs-reported-by', jQuery.trim(form.wbAuthor.value) + ' ~~' + '~~' );
		}
 
		var reportedPage = this.getRefinedPageName( form.wbPageTitle.value.replace( /[\[\]]/g, '' ) );
		var talkPageName = mw.config.get('wgFormattedNamespaces')[1] + ':' + reportedPage
		var isFile = this.getPageNamespaceNumber( reportedPage ) === 6;
 
		if ( !this.isValidPageName( reportedPage ) ) {
			alert( mw.msg( 'wikibugs-invalid-page' ) );
 
			var refinedPageName = this.getRefinedPageName( mw.config.get( 'wgPageName' ) );
			if ( this.isValidPageName( refinedPageName ) ) {
				form.wbPageTitle.value = refinedPageName;
			} else {
				form.wbPageTitle.value = '';
				form.wbPageTitle.focus();
			}
			return;
		}
 
		this.suppressSubmit = true;
		var $loadingIcon = jQuery( '#wikibugs-loading-icon' );
		$loadingIcon.show();
 		var section_uniq = Date.now();
		var toInsertReport = '{{מצב|חדש}}\n'+(mw.config.get('wgNamespaceNumber') == 0? '{{#lst:'+talkPageName+'|'+section_uniq+'}}' : content);
		var toInsertTalk = 
		'<קטע התחלה="' + section_uniq + '" />'
		+ '\n=== פרטי הדיווח ===\n'
		+ content
		+ '\n\n\n<!-- נא להוסיף דברים מעל שורה זו -->'
		+ '\n<קטע סוף="' + section_uniq + '" />';

		var reportPage = this.reportPage.replace( / /g, '_' );

		//EDIT THE "REPORT AN ERROR" PAGE
		var api=new mw.Api();
		var postToReportPage = function(){
			return api.postWithToken( 'edit',
			{
				action: 'edit',
				title: reportPage,
				section: 'new',
				sectiontitle: '[[:'+reportedPage+']]',
				text: toInsertReport,
				summary: '/* ' + reportedPage + ' */ ' + mw.msg('wikibugs-new-report-summary-suffix')
			}).fail(function(){
				mw.notify( mw.msg( 'wikibugs-ajax-error' ) );
				this.suppressSubmit = false;
				$loadingIcon.hide();
			}).done(function(){
				window.location = mw.util.getUrl(reportPage) + '#catlinks';
			});
		}
		if (mw.config.get('wgNamespaceNumber') == 0) {
			api.postWithToken( 'edit',
			{
			action: 'edit',
			title: talkPageName,
			section: 'new',
			sectiontitle: mw.msg( 'wikibugs-new-report-talk-title' ),
			text: toInsertTalk,
			summary: mw.msg('wikibugs-new-report-summary-prefix')
			} ).then(function(data){
				if( data.edit && data.edit.result === 'Success' ){
					postToReportPage()
				}
				else {
					mw.notify( mw.msg( 'wikibugs-ajax-error' ) );
				}
			});
		} else {
			postToReportPage();
		}
	}
};
 
 $(function(){
	$('#n-featured-articles').after('<li class="n-bug_in_article mw-list-item"><a href="#">דיווח על טעות</a></li>');
	if(mw.user.isAnon()){
		$('li#pt-anoncontribs').before('<li class="n-bug_in_article mw-list-item"><a href="#">דיווח על טעות</a></li>');
	}
	wikiBugsGadget.init();
});