MediaWiki:Gadget-Ricetta.js

Wikibooks, manuali e libri di testo liberi.

Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.

  • Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
  • Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
  • Internet Explorer / Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5
  • Opera: premi Ctrl-F5.
/// <pre> 
/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++                CREAZIONE RAPIDA RICETTA                             +++
+++ codice originale di Wim b con l'aiuto fondamentale di Ricordisamoa	+++ 
+++ 	e Daimona Eaytoy (praticamente tutti tranne Wim b alla fine)	+++
                        vers. beta 1.1
                        
1.1 -	Creazione della casella per creare il titolo
1.2 -	Implementazione avvisi in caso campi obbligatori lasciati vuoti;
		Sostituito il pulsante per scrivere con uno che sfrutta OOUI;
		Ora la pagina viene creata con l'iniziale maiuscola;
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
/* jshint maxerr: 10000 */
/* global $, mw */


//creo il link nelle pagine speciali
if (mw.config.get('wgCanonicalSpecialPageName') === 'Specialpages') {
    $('#mw-specialpagesgroup-pagetools').next().find('ul').eq(0)
        .prepend('<li><a href="/wiki/Speciale:Ricetta">Scrivi ricetta</a></li>');
}

//Creo il link nel portlet
mw.loader.using('mediawiki.util').then(function() {
    mw.util.addPortletLink('p-tb', '/wiki/Speciale:Ricetta', 'Nuova ricetta', 'p-ricetta', 'segui la procedura guidata per creare una nuova ricetta');
});

// Evito link rosso nelle pagine dei contenuti

$("a[href$='/wiki/Speciale:Ricetta']").attr({
    'title': 'Speciale:Ricetta'
}).removeClass();


// CREAZIONE CASELLA E BOTTONE PER LA CREAZIONE DELLE RICETTE
//personalizzazioni variabili
var DefaultTXT = 'Inserisci il titolo della ricetta';
var ButtonRicettaLabel = 'Crea ricetta';

//casella di testo
var textInputRicetta = new OO.ui.TextInputWidget({
	indicator: 'required',
    placeholder: DefaultTXT,
    id: 'TXTTitleRicetta'
});

//bottone di ricerca
var buttonRicetta = new OO.ui.ButtonWidget({
    label: ButtonRicettaLabel,
    flag: 'progressive',
});
	
$('#InputRicette').append(textInputRicetta.$element);
$('#BottoneRicette').append(buttonRicetta.$element);

//Bottone di Submit per scrivere la ricetta
var buttonSubmitRicettaTXT = 'Scrivi';

var buttonSubmitRicetta = new OO.ui.ButtonWidget( {
	label: buttonSubmitRicettaTXT,
	target: '_blank',
	flags: [
		'primary',
		'progressive'
	]
});

//Funzione per creare le finestre
function AlertWindow (alertTitle, alertTXT, AlertSize) {
        var messageDialog = new OO.ui.MessageDialog();

	// Crea e appende la finetra.
        var windowManager = new OO.ui.WindowManager();
        $(document.body).append(windowManager.$element);
        windowManager.addWindows([messageDialog]);
        
    // Apre la finestra di errore.
    	alertSize = (AlertSize === "" ? '' : AlertSize);
        windowManager.openWindow(messageDialog, {
        	id: 'RicettaAlert',
        	size: alertSize,
            title: alertTitle,
            message: new OO.ui.HtmlSnippet( alertTXT ),
            verbose: true,
            actions: [{
                action: 'accept',
                label: 'Chiudi',
                flags: 'primary'
            }]
        });
}

// Avviso errore compilazione Form per creare la ricetta
buttonRicetta.$element.click(function() {
    RicettaTarget = $('#TXTTitleRicetta input').val();

    if (RicettaTarget === "") {
	//TESTO VUOTO: Visualizza un prompt per inserire il titolo corretto
    	OO.ui.prompt( 'Stai tentando di inserire una nuova ricetta senza però specificare il titolo. Inseriscilo nella casella qui sotto e premi "Ok"', {
	    	textInput: { placeholder: 'Inserisci un nome per la ricetta' },
	    	title: 'Titolo della ricetta vuoto',
		} ).done( function ( result ) {
			if ( result !== null ) {
				if ( result !== "" ) {
			// Se il testo viene inserito:
					window.location = "/wiki/Speciale:Ricetta?ricetta="+result+"";
				} else {
			// Se il testo NON viene inserito per la seconda volta:
					AlertWindow ('Titolo della ricetta vuoto, di nuovo', 'Non vuoi proprio inserirlo il titolo di questa ricetta, vero?!<br>'
					+'<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Burro_feliz_merida.JPG/180px-Burro_feliz_merida.JPG">'
					+'<br><div style="visibility: hidden">Shock the Donkey</div>') ;
				}
				
			} else {
				null;
				
			}
			
		});
    	
    } else {
        // reindirizzamento alla pagina speciale
        // (se il titolo viene inserito subito nella casella)
        window.location = "/wiki/Speciale:Ricetta?ricetta=" + RicettaTarget + "";
    }

});

if (mw.config.get('wgNamespaceNumber') == -1 && mw.config.get('wgTitle') == 'Ricetta') {
    $(document).ready(function() {

		// FUNZIONE PER RECUPERARE L'URL, di wikipedia:User:Splarka
		function queryString(p) {
			var re = RegExp('[&?]' + p + '=([^&]*)');
			var matches;
			if (matches = re.exec(document.location)) {
				try {
            return decodeURI(matches[1]);
				} catch (e) {}
			}
			return null;
		}
		
        //Sostituisco il titolo
        $('h1').text('Nuova ricetta');

        // e l'intestazione nel tab
        document.title = 'Creazione nuova ricetta - Wikibooks';

        $('#bodyContent').replaceWith('Inserisci tutti i dati richiesti per scrivere velocemente una nuova ricetta' +
            '<input name="title" type="hidden" value="Speciale:Ricetta" />' +
            '<fieldset><legend>Creazione rapida di una nuova ricetta</legend>' +
            '<h3>Informazioni preliminari </h3>' +
            '<li><b>Nome della ricetta:</b> <input type="text" id="NomeRicetta" name="NomeRicetta size="30"></li>' +
            '<li><b>Breve descrizione:</b> (Descrizione aspetto, indicazione periodo o ricorrenza, ecc…)</li>' +
            '<textarea rows="4" cols="50" id="DescrizioneRicetta" name="DescrizioneRicetta"></textarea>' +
            '<li><b>Per quante persone:</b> <input type="text" id="NumeroPersone" name="NumeroPersone" size="3" maxlength="2"></li>' +
            '<h3>Ingredienti: <button id="addIngrediente" >+</button><p></p> </h3>' +
            '<div id="IngredientiNuovi">' +
            '<div id="IngredientiAggiuntivi">' +
            'Ingrediente:<span id="ing00"></span> <input class="mw-ui-input Ingrediente" name="NuovoIngrediente00" id="NuovoIngrediente00" size="80%">' +
            '&nbsp;' +
            'Quantità: <input class="mw-ui-input IngredienteQ" name="NuovaQuantita00" id="NuovaQuantita00" size="6" maxlength="5" value=""> <select id="Quantita00" name="Quantita00">' +
            '<optgroup id="Liquidi" name="Liquidi" label="Liquidi">Liquidi</optgroup>' +
            '<option value="ml">millilitri</option>' +
            '<option value="cl">centilitri</option>' +
            '<option value="l">litri</option>' +
            '<optgroup id="Solidi" name="Solidi" label="Solidi">Solidi</optgroup>' +
            '<option value="mg">milligrammi</option>' +
            '<option value="g">grammi</option>' +
            '<option value="hg">etti</option>' +
            '<optgroup id="Altro" name="Altro" label="Altro">Altro</optgroup>' +
            '<option value="q. b.">quanto basta</option>' +
            '<option value="cucchiaio">cucchiaio</option>' +
            '<option value="cicchiaino">cicchiaino</option>' +
            '<option value="pizzico">pizzico</option>' +
            '</select>' +
            '<input name="AltraUnita00" type="checkbox" value="" id="AltraUnita00" style="">Altra unità di misura</input> <input class="mw-ui-input" name="Altro00" id="Altro00" size="10"/></input> <p></p>' +
            '</div>' +
            '</div>' +
            '</td></tr>' +
            '</table>' +
            '<h3>Passaggi: <button id="addPassaggio" >+</button><p></p> </h3>' +
            '<div id="PassaggiNuovi">' +
            '<div id="PassaggiAggiuntivi">' +
            'Passaggio:<input class="mw-ui-input Passaggio" name="Passaggio00" id="Passaggio00" size="80%"/>'
            //	+ '<textarea id="passaggi" type="text" rows="10" name="passaggi"; />'
            +
            '<br/>' +
            '</div>' +
            '</div>' +
            '\n' +
            '<h3>Consigli:</h3>' +
            '<input name="CBConsigli" type="checkbox" value="" id="CBConsigli" style="">Hai dei consigli per questa ricetta?' +
            '<textarea rows="4" cols="50" id="ConsigliRicetta" name="ConsigliRicetta" disabled></textarea>' +
            '\n' +
            '<h3>Categorie:</h3>' +
            '<div id="ElencoCategorie"></div>' +
            '<p></p>' +
            '<div id="Button"></div>' +
            '</fieldset><div id="results" style="visibility: hidden"></div></form>').ready(function() {


		// Appendo il  bottone per scrivere la ricetta
			$('#Button').parent().append( buttonSubmitRicetta.$element );
			
		// paramentro che equivale al nome della ricetta (recuperato dal titolo)
            $('#NomeRicetta').val(queryString('ricetta'));

            //ID incrementali per gli ingredienti
            var current_id = 0;
            $('#addIngrediente').click(function() {
                nextElement($('#IngredientiAggiuntivi'));
            });

            function nextElement(element) {
                var newElement = element.clone().appendTo($('#IngredientiNuovi'));
                current_id++;
                var id = (current_id < 50 ? '0' : '') + current_id;
                newElement.attr('id', newElement.attr('id').replace(/00/, id));
                $('input', newElement).each(function() {
                    $(this).attr('id', $(this).attr('id').replace(/00/, id));
                    var nome = $(this).attr('id');
                    $(this).attr('name', nome);
                }).val('');
                //Menù a discesa
                $('select', newElement).each(function() {
                    $(this).attr('id', $(this).attr('id').replace(/00/, id));
                    var nome = $(this).attr('id');
                    $(this).attr('name', nome);
                }).val('');
                $('#addIngrediente').prop('disabled', current_id > 49);
            }


            //ID incrementali per i passaggi
            var current_idPassaggi = 0;
            $('#addPassaggio').click(function() {
                nextElementInt($('#PassaggiAggiuntivi'));
            });

            function nextElementInt(element) {
                var newElementInt = element.clone().appendTo($('#PassaggiNuovi'));
                current_idPassaggi++;
                var idPassaggi = (current_idPassaggi < 100 ? '0' : '') + current_idPassaggi;
                newElementInt.attr('id', newElementInt.attr('id').replace(/00/, idPassaggi));
                $('input', newElementInt).each(function() {
                    $(this).attr('id', $(this).attr('id').replace(/00/, idPassaggi));
                    var nomeInt = $(this).attr('id');
                    $(this).attr('name', nomeInt);
                }).val('');
                $('#addPassaggio').prop('disabled', current_idPassaggi > 99);
            }


            ///Gestione del CB per i consigli
            $('input#CBConsigli').change(function() {

                if (this.checked) {
                    $('textarea#ConsigliRicetta').attr('disabled', false).focus();
                } else {
                    $('textarea#ConsigliRicetta').attr('disabled', true);
                }
                return false;
            });


            // Funzione API per recuperare le categorie delle ricette
            var api = new mw.Api();

            function getSubCategories(title, cont, pages) {
                return api.get($.extend({
                    action: 'query',
                    generator: 'categorymembers',
                    gcmtitle: title,
                    gcmtype: 'subcat',
                    gcmlimit: 'max',
                    prop: 'categoryinfo|categories',
                    clcategories: title,
                    clprop: 'sortkey'
                }, cont)).then(function(data) {
                    pages = $.extend(true, {}, pages || {}, data.query.pages);

                    if (data['continue'] !== undefined) {
                        return getSubCategories(title, data['continue'], pages);
                    }

                    return $.map(pages, function(page) {
                        return page;
                    }).sort(function(a, b) {
                        if (a.categories[0].sortkey > b.categories[0].sortkey) {
                            return 1;
                        }
                        if (a.categories[0].sortkey < b.categories[0].sortkey) {
                            return -1;
                        }
                        return 0;
                    });
                });
            }

            function doneFilter(level, cbLevel, pages) {
                return pages.map(function(page) {
                    var $li = $('<li>').append(
                        $('<label>')
                        .text(new mw.Title(page.title).getMainText())
                        .prepend(
                            level >= cbLevel ?
                            $('<input>').attr({
                                type: 'checkbox',
                                name: 'Categoria',
                                value: new mw.Title(page.title).getMainText()
                            }) : []
                        )
                    );

                    if (page.categoryinfo.subcats > 0) {
                        $('<button>')
                            .append(
                                $('<span>').text('►'),
                                $('<span>').text('▼').hide()
                            )
                            .one('click', function() {
                                var $ul = makeList(page.title, level + 1, cbLevel).appendTo($li);
                                $(this).children().toggle();

                                $(this).on('click', function() {
                                    $ul.toggle();
                                    $(this).children().toggle();
                                });
                            })
                            .prependTo($li);
                    }

                    return $li;
                });
            }

            function makeList(title, level, cbLevel) {
                var $ul = $('<ul>').css('list-style', 'none').append(
                    $('<li>').text('caricamento in corso...')
                );

                getSubCategories(title, {})
                    .then(
                        doneFilter.bind(
                            null,
                            level !== undefined ? level : 0,
                            cbLevel !== undefined ? cbLevel : 1
                        )
                        //failFilter
                    )
                    .always(function($listContents) {
                        $ul.empty().append($listContents);
                    });

                return $ul;
            }

            makeList('Categoria:Ricette').appendTo('#ElencoCategorie');

            //FUNZIONE QUANDO SI PREME IL BOTTONE
            buttonSubmitRicetta.$element.click(function (event) {
            	
			// Funzione per trasformare la prima lettera in maiuscola
				String.prototype.ucfirst = function() {
					return this.charAt(0).toUpperCase() + this.slice(1);
					
				};

                // Funzione per scrivere materialmente nelle pagine
                function writeInPage(title, content, summary, option, section, success, tags) {
                    var param = {
                        action: 'edit',
                        title: title,
                        summary: summary,
                        tags: tags,
                        format: 'json'
                    };
                    param[option || 'text'] = content;
                    if (section || section === 0) {
                        param.section = section;
                    }
                    new mw.Api().postWithEditToken(param)
                        .done(function() {
                            if (typeof(success) === 'function')
                                success();
                        });
                }

                var success = '<span style="color:#00A050; font-size:20px">√</span>';

                // recupera e mette in elenco i valori dei passaggi della ricetta
                resPass = $('input.Passaggio').map(function(_, el) {
                    return $(el).val();
                }).get().join(';\n# ');
                var resPass = '# ' + resPass + '.';

                // Elenca tutte le categorie da aggiungere
                resCat = $('input[name=Categoria]:checked').map(function(_, el) {
                    return $(el).val();
                }).get().join('|');
                var resCat = '{{Categorie della ricetta|' + resCat + '}}';

                var values = Object.create(null);
                $('#IngredientiNuovi :input').serializeArray().forEach(function(input) {
                    values[input.name] = input.value;
                });

                //Funzione per recuperare l'lenco degli ingredienti
                var resIngr = $('#IngredientiNuovi > *').map(function(i) {
                    var id = (i < 50 ? '0' : '') + i,
                        ing = [],
                        qua = values['NuovaQuantita' + id];
                    var preposizione = (values['Quantita' + id] === null || values['Altro' + id] === '') ? "" : " di ";
                    if (qua) {
                        ing.push(qua);
                    }
                    ing.push(
                        values[('AltraUnita' + id in values ? 'Altro' : 'Quantita') + id],
                        preposizione,
                        values['NuovoIngrediente' + id]
                    );
                    return ing.join(' ');
                }).get().join(';\n* ');
                resIngr = '* ' + resIngr + '.';

                //INIZIO VARIABILI DEL TESTO
                var NomeRicetta = $("#NomeRicetta").val().ucfirst();
                var NumeroPersone = $("#NumeroPersone").val();
                var TxtPersone = (NumeroPersone > 1 ? 'persone' : 'persona');
                var DescrizioneRicetta = $('#DescrizioneRicetta').val();
                var ConsigliRicetta = $('#ConsigliRicetta').val();

                //Gestione CB per i consigli, se no ce ne sono, non scrive niente
                var SezConsigliRicetta;
                if ($('input#CBConsigli').is(':checked')) {
                    SezConsigliRicetta = '== Consigli ==\n' + ConsigliRicetta + '\n\n';
                } else {
                    SezConsigliRicetta = '';
                }

                //Testo da scrivere nelle pagina
                var Testo = '' + DescrizioneRicetta + '.\n' +
                    '\n' +
                    '== Ingredienti ==\n' +
                    'per \'\'\'' + NumeroPersone + '\'\'\' '+TxtPersone+'\n' +
                    '\n' +
                    '' + resIngr + '\n' +
                    '\n' +
                    '== Preparazione ==\n' +
                    '\n' +
                    '' + resPass + '\n' +
                    '\n' +
                    '' + resCat + '';

			//Valori di default per compararli con i valori delle variabili e "decidere" se avvisare o meno
					var resCatDefault = '{{Categorie della ricetta|}}';
					var resPassDefault = '# .';
					var resIngrDefault= '* ml  .';
			// Controllo su eventuali campi vuoti e relativo avviso					
                    if (resCat === resCatDefault || resPass === resPassDefault || resIngr === resIngrDefault || NumeroPersone === "" || NomeRicetta === "" ) {
                // testo delle voci dell'elenco puntato d'aiuto sui parametri mancanti
                    	var ANomeRicetta = (NomeRicetta === "" ? '<li> <b>Nome</b> - è necessario inserire il nome della ricetta <br>' : '');
                    	var AresCat = (resCat === resCatDefault ? '<li> <b>Categorie</b> - inserisci almeno una categoria <br>' : '');
                    	var AresPass = (resPass === resPassDefault ? '<li> <b>Passaggi</b> - inserisci almeno un passaggio <br>' : '');
                    	var AresIngr = (resIngr === resIngrDefault ? '<li> <b>Ingredienti</b> - inserisci almeno un ingrediente <br>' : '');
                    	var ANumeroPersone = (NumeroPersone === "" ? '<li> <b>Per quante persone</b> - inserisci il numero di persone a cui si referiscono le dosi <br>' : '');
                // Testo dell'avviso "parametri mancanti"
                		AlertWindow ('ATTENZIONE: Campi non compilati', 'I seguenti campi fondamentali non risultano compilati:<br>'
                    	+''+ANomeRicetta+AresCat+AresPass+AresIngr+ANumeroPersone+'Inserisci tutte queste informazioni e poi premi nuovamente "'+buttonSubmitRicettaTXT+'"', 'large');
                    } else {
						mw.loader.using('mediawiki.user', writeInPage("Libro di cucina/Ricette/" + NomeRicetta, "" + Testo + "", "[[MediaWiki:Gadget-Ricetta.js|Script]]: Creazione nuova ricetta", "text", false, function() {
						AlertWindow ('Complimenti!',success + ' La pagina "<a href="/wiki/Libro di cucina/Ricette/' + NomeRicetta + '" id="PageCreated">' + NomeRicetta + '</a>" è stata creata con successo.<br><br>Se hai altre modifiche da apportare alla ricetta, puoi seguire il link e <a href="/w/index.php?title=Libro di cucina/Ricette/' + NomeRicetta + '&action=edit" id="PageEdit"> iniziare a modificare</a>', 'medium');
							
						}, "Ricette (BETA)"));
                    }

            });
        });
    }); //chiusura $(document).ready
}

/* resPass = elenco di tutti i passaggi della ricetta
resCat = elenco di tutte le categorie da aggiungere 
resIng = Elenco di tutti gli ingredienti
*/