לדלג לתוכן

מדיה ויקי: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> פועל ללא לאות כדי למנוע הופעת תוכן בלתי הולם באתר. עם זאת, אם נפלה שגגה והועתק תוכן מוויקיפדיה ללא בקרה מספקת, ולדעתכם אין לו מקום באנציקלופדיה יהודית, אנא דווחו כאן למטה. </br></br>' +
		'שימו לב, כל אחד יכול לערוך כמעט כל דף במכלול – אנו ממליצים שתנסו <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( 'המכלול:דיווח בדוא"ל על תוכן בלתי הולם' ) + '">' +
		'[email protected]</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-edit' ).find( 'a' );
		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' )+': ' + source + '\n\n'
		}
 
		// Append a signature to the report
		if ( !mw.user.isAnon() ) {
			content += mw.msg( 'wikibugs-reported-by', '~~' + '~~' );
		} else {
			content += mw.msg( 'wikibugs-reported-by', 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);
		console.log('toInsertReport: ', toInsertReport)
		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-ערכים-מומלצים').after('<li class="n-bug_in_article"><a href="#">דיווח על תוכן בלתי הולם</a></li>');
	if(mw.user.isAnon()){
		$('li#pt-createaccount').after('<li class="n-bug_in_article"><a href="#">דיווח על תוכן בלתי הולם</a></li>');
	}
	wikiBugsGadget.init();
});