מדיה ויקי:Gadget-validate-template-params.js

מתוך צפונות ויקי

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

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אינטרנט אקספלורר / אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
  • אופרה: ללחוץ על Ctrl-F5.
// window.pvem_first = true;
window.mw.hook( 'wikipage.content' ).add( function( content ) {
	if ( $( '.paramvalidator-wrapper',  content ).length ) // page contains errors - let's get to work.
		mw.loader.using( ['mediawiki.util', 'mediawiki.storage', 'oojs-ui', 'site', 'user'] ).done( function() {
			const
				docuPage = 'ויקיפדיה:מערכת בדיקת פרמטרים/תיקון שגיאות',
				exposeVal = 'expose',
				firstVal = 'first',
				stickyVal = 'sticky',
				stickyKey = 'pvemLastState';
			var
				behavior = window.pvem_behavior,
				$allErrors = $('.paramvalidator-wrapper').addClass('pvem-wrapper'),
				numErrors = $allErrors.length,
				tooltip = numErrors > 1 
						? 'יש בדף שגיאות פרמטריות ב-' + numErrors + ' תבניות ' 
						: 'יש בדף שגיאה פרמטרית בתבנית',
				buttonsOfActions = {},
				popupButton = new OO.ui.PopupButtonWidget( {
					label: '{{' + numErrors + '}}',
					title: tooltip,
					flags: [
						'primary',
						'destructive'
					],
					indicator: 'down',
					classes: ['pvem-main-button'],
					popup: {
						padded: true,
						expanded: true,
        				align: 'center',
						classes: ['pven-popup'],
						width: 800,
						head: true,
						label: 'שגיאות ממערכת בקרת הפרמטרים',
						$content: $('<div>')
							.append(createButtons())
							.append($('<p>'))
							.append(buildContent())
					}
				} );

			function adjustVisible() {
				if (buttonsOfActions[expose]) {
					var visible = $('.pvem-wrapper.pvem-visible').length;
					buttonsOfActions[hide].setDisabled(!visible);
					buttonsOfActions[expose].setDisabled(visible);
				}
			}
			
			function exposeOrHide(toExpose) {
				$allErrors
					.toggleClass('pvem-visible', toExpose)
					.nextAll()
						.toggleClass('pvem-faulty-template', toExpose);
				adjustVisible();
				mw.storage.set(stickyKey, toExpose ? exposeVal : '');
			}
				
			function expose() {
				// find collapsed elements containing warnings, and expand them
				$('.mw-collapsible:has(.paramvalidator-wrapper)')
					.find('.mw-collapsible-toggle-collapsed a')
						.click();
				exposeOrHide(true); 
			}
			
			function hide() { exposeOrHide(false); }
				
			function goto_error(n) {
				expose();
				window.location.href = '#pvem-' + n;
			}
				
			function first() { goto_error(1); }
			
			function gotoDocuPage() { window.location.href = mw.util.getUrl(docuPage); }
			
			function confirmdOptOut() {
				if (OO.ui.confirm($('<div>')
						.append($('<p>').text("אם תאשרו את הפעולה, יבוטל הגאדג'ט בהעדפות שלכם, ולא תראו יותר את ההודעות הללו.")
						).append($('<p>').text("תוכלו להפעילו שוב בכל זמן, דרך העדפות => גאדג'טים."))
				   	))
					opt_out();
			}
			
			function createButtons() {
				function makeButton(label, action) {
					var button = new OO.ui.ButtonWidget( {
							label: label
						} )
						.on('click', action);
					buttonsOfActions[action] = button;
					return button.$element;
				}
				
				return $('<div>')
					.addClass('pvem-buttons')
					.append(makeButton('חשיפת השגיאות', expose))
					.append(makeButton('הסתרת השגיאות', hide))
					.append(makeButton('הסבר והנחיות', gotoDocuPage))
					.append(makeButton('להפסיק לקבל הודעות', confirmdOptOut));
			}
			
			function buildContent() {
				var 
					idPrefix = 'pvem-',  //ParamValidatorErrorMessage
					current = 1,
					div = $('<div>').addClass('pvem-errorlist');
					
				function addMessage($message, anchor) {
					var $processed;
					$message.find('p, input').remove(); //todo:remove this once common.js is cleaned
					try {
						$processed = $($message.html());
					} catch(ex) {
						$processed = $('<span>').text($message.text());
					}
					$processed.find('br').remove();
					$('<p>')
						.append($('<a>', { href: anchor, title: 'לשגיאה' })
							.text('לשגיאה ↓')
							.click(function() {
								expose();
								mw.storage.set(stickyKey, firstVal);
							})
							.addClass('pvem-message-link')
						)
						.append($processed)
						.appendTo(div);
				}
				
				$allErrors.
					each(function() {
						var 
							id =  idPrefix + current++,
							anchor = '#' + id,
							$message = $(this).attr('id', id);
								
						addMessage($message, anchor);
					});
				return div;
			}
				
			function opt_out() {
				mw.loader.using(['mediawiki.api', 'mediawiki.user']).done(function() {
					new mw.Api().post( {
						action: 'options',
						optionname: "gadget-validate-template-params",
						optionvalue: 0,
						token: mw.user.tokens.get('csrfToken')
					}); // post
				}); // using
			}
			
			$( mw.util.addPortletLink('p-views', '#', 'שגיאות פרמטריות',  'ca-paramerrors') )
				.addClass( 'validator-portlet' )
				.empty()
				.append(popupButton.$element);
			
			function behave(behavior) {
				switch (behavior) {
					case exposeVal: 
						expose();
						break;
					case firstVal:
						setTimeout(first, 200);
						break;
					case stickyVal:
						behave(mw.storage.get(stickyKey));
						break;
				}
			}
			
			importStylesheet('Mediawiki:Gadget-validate-template-params.css'); 
			adjustVisible();
			behave(behavior);
		} );
} );