MediaWiki:Gadget-insert-inflection.js: Różnice pomiędzy wersjami

Z Wikisłownika – wolnego słownika wielojęzycznego
Usunięta treść Dodana treść
m jeszcze problem z 'this'
pomylka: to klikniecie na 'Wstaw szablon' (a nie 'Zapisz strone') powinien anulowac dzialanie confirmCloseWindow
Linia 137: Linia 137:
} );
} );
$( '#editform' ).on( 'submit', allowCloseWindow.release );
$( insertButton ).on( 'click', allowCloseWindow.release );
},
},



Wersja z 18:36, 4 cze 2016

/*
 * @author: [[:pl:User:Beau]]
 */

/* Translatable strings - FIXME: extract all messages */
mw.messages.set( {
	'inflection-insert-noun-subject': 'Wstaw temat',
	'inflection-noun-subject': 'Temat rzeczownika: ',
	'inflection-insert-button-title': 'Wstaw odmianę (wersja $1)',
	'inflection-insert-button-alt': 'Wstaw odmianę'
} );

window.inflectionGadget = { /** Version of the gadget */
	version: 11,
	templates: templates, // MediaWiki:Gadget-insert-inflection-data.js
	panel: null,
	languageSelector: null,
	templateSelector: null,
	selectedTemplate: null,
	formContainer: null,

	/** Sets up the gadget */
	init: function() {
		if ( mw.config.get( "wgAction" ) != 'edit' && mw.config.get( "wgAction" ) != 'submit' ) {
			return;
		}

		if ( this.templates.length < 1 ) {
			return;
		}

		var that = this;
		toolbarGadget.addButton( {
			icon: "//upload.wikimedia.org/wikipedia/commons/0/04/Button_array.png",
			title: mw.msg( 'inflection-insert-button-title', this.version ),
			alt: mw.msg( 'inflection-insert-button-alt' ),
			id: 'insertInflectionButton',
			onclick: function() {
				that.togglePanel();
			}
		} );
	},

	togglePanel: function() {
		if ( this.panel ) {
			if ( this.panel.style.display == 'none' ) {
				this.panel.style.display = 'block';
			} else {
				this.panel.style.display = 'none';
			}
			return;
		}

		this.panel = document.createElement( 'div' );
		this.panel.style.paddingTop = '0.2em';
		this.panel.style.paddingBottom = '0.2em';

		var that = this;

		this.languageSelector = document.createElement( "select" );
		this.languageSelector.onchange = function() {
			that.selectLanguage();
		};
		this.languageSelector.style.verticalAlign = 'middle';

		this.templateSelector = document.createElement( "select" );
		this.templateSelector.onchange = function() {
			that.selectTemplate();
		};
		this.templateSelector.style.verticalAlign = 'middle';

		var selectedLanguage = parseInt( jQuery.cookie( 'inflectionLanguage' ) );
		if ( !selectedLanguage ) {
			selectedLanguage = 0;
		}

		for ( var i in this.templates ) {
			var template = this.templates[i];
			var option = document.createElement( 'option' );
			option.value = i;
			if ( i == selectedLanguage ) {
				option.selected = true;
			}
			option.appendChild( document.createTextNode( template.title ) );
			this.languageSelector.appendChild( option );
		}

		var topLine = document.createElement( 'div' );
		topLine.appendChild( document.createTextNode( 'Język: ' ) );
		topLine.appendChild( this.languageSelector );
		topLine.appendChild( document.createTextNode( 'Szablon: ' ) );
		topLine.appendChild( this.templateSelector );

		this.formContainer = document.createElement( 'div' );

		var insertButton = document.createElement( "input" );
		insertButton.type = "button";
		insertButton.value = "Wstaw szablon";
		insertButton.onclick = function() {
			that.insertTemplate();
		};

		var cancelButton = document.createElement( "input" );
		cancelButton.type = "button";
		cancelButton.value = "Anuluj";
		cancelButton.onclick = function() {
			that.togglePanel();
		};

		var bottomLine = document.createElement( 'div' );
		bottomLine.appendChild( insertButton );
		bottomLine.appendChild( document.createTextNode( ' ' ) );
		bottomLine.appendChild( cancelButton );

		this.panel.appendChild( topLine );
		this.panel.appendChild( this.formContainer );
		this.panel.appendChild( bottomLine );

		var textarea = document.getElementById( 'wpTextbox1' );
		if ( !textarea ) {
			return;
		}

		textarea.parentNode.insertBefore( this.panel, textarea );

		var selectedTemplate = parseInt( jQuery.cookie( 'inflectionTemplate' ) );
		this.selectLanguage( selectedTemplate );
		
		var allowCloseWindow = mw.confirmCloseWindow( {
			test: function () {
				return $( that.panel ).find( 'input[type="text"]' ).get()
					.some( function ( input ) {
						return input.value !== '';
					} );
			},
			namespace: 'insert-inflection'
		} );
		
		$( insertButton ).on( 'click', allowCloseWindow.release );
	},

	selectLanguage: function( selectedTemplate ) {
		var language = this.templates[this.languageSelector.value];
		jQuery( this.templateSelector ).children().remove();

		if ( !selectedTemplate ) {
			selectedTemplate = 0;
		}

		for ( var i in language.templates ) {
			var template = language.templates[i];
			var option = document.createElement( 'option' );
			option.value = i;
			if ( i == selectedTemplate ) {
				option.selected = true;
			}
			option.appendChild( document.createTextNode( template.title ) );
			this.templateSelector.appendChild( option );
		}
		this.selectTemplate();
	},

	selectTemplate: function() {
		var language = this.templates[this.languageSelector.value];
		var template = language.templates[this.templateSelector.value];

		jQuery.cookie( 'inflectionLanguage', this.languageSelector.value, {
			expires: 30
		} );
		jQuery.cookie( 'inflectionTemplate', this.templateSelector.value, {
			expires: 30
		} );

		this.selectedTemplate = template;

		jQuery( this.formContainer ).children().css( 'display', 'none' );
		if ( template.element ) {
			template.element.style.display = 'block';
			return;
		}

		var form = document.createElement( 'div' );
		var table = document.createElement( 'table' );

		var elements = [];
		for ( var i in template.fields ) {
			var field = template.fields[i];
			if ( field.caption !== null ) {
				var caption = document.createTextNode( field.caption );
				var input = document.createElement( 'input' );
				input.type = 'text';
				elements.push( caption );
				elements.push( input );
				field.input = input;
			}
		}

		while ( elements.length > 0 ) {
			var row = document.createElement( 'tr' );
			var rowElements = elements.splice( 0, 4 );
			for ( var i in rowElements ) {
				var cell = document.createElement( 'td' );
				cell.appendChild( rowElements[i] );
				row.appendChild( cell );
			}
			table.appendChild( row );
		}

		if ( template.title == 'rzeczownik' ) {
			var $form = jQuery( form );
			var $div = jQuery( '<div/>' );
			var $inputSubject = jQuery( '<input type="text" />' );
			var $inputButton = jQuery( '<input type="button" />' );
			$inputButton.bind( 'click', function() {
				$form.find( 'input[type="text"]' ).val( $inputSubject.val() );
			} );

			$inputButton.val( mw.msg( 'inflection-insert-noun-subject' ) );
			$div.append( mw.msg( 'inflection-noun-subject' ), $inputSubject, $inputButton );
			$form.prepend( $div );
		}

		form.appendChild( table );
		this.formContainer.appendChild( form );
		template.element = form;
	},

	insertTemplate: function() {
		var data = this.selectedTemplate;
		var fields = {};
		var padding = 0;
		for ( var i in data.fields ) {
			var field = data.fields[i];
			if ( field.input != null ) {
				fields[field.name] = field.input.value;
			} else {
				fields[field.name] = field.value;
			}
			if ( field.name.length > padding ) {
				padding = field.name.length;
			}
		}
		padding++;

		var text = "{{" + data.template + "\n";
		
		for ( var name in fields ) {
			var value = fields[name];
			while ( name.length < padding ) {
				name += ' ';
			}
			if (name[0]>='0' && name[0]<='9')
				text += "|" + value + "\n";
			else
				text += "|" + name + " = " + value + "\n";
		}
		text += "}}";
		jQuery( "#wpTextbox1" ).focus();
		mw.toolbar.insertTags( text, '', '' );
	}
};

inflectionGadget.init();