Järjestelmäviesti:Gadget-OmaLomake.js

Wikisanakirjasta

Huomautus: Selaimen välimuisti pitää tyhjentää asetusten tallentamisen jälkeen, jotta muutokset tulisivat voimaan.

  • Firefox ja Safari: Napsauta Shift-näppäin pohjassa Päivitä, tai paina Ctrl-F5 tai Ctrl-R (⌘-R Macilla)
  • Google Chrome: Paina Ctrl-Shift-R (⌘-Shift-R Macilla)
  • Internet Explorer ja Edge: Napsauta Ctrl-näppäin pohjassa Päivitä tai paina Ctrl-F5
  • Opera: Paina Ctrl-F5.
mw.loader.using('mediawiki.api', function () {
    var checkedPages = {};
    var reg = /\$("([^"]*)"|)([0-9]+)/g;
    var $message;

    var api = new mw.Api({
        ajax: {
            headers: {
                'Api-User-Agent': 'omapohja/0.1'
            }
        }
    });
    
    function getFilledText($root) {
        var text = $root.find('.omapohja-preload').val();
        
        var out = text.replace(reg, function (m, p1, p2, p3) {
            return $root.find('input[data-field=' + p3 + ']').val();
        });

        return out;
    }

    function disable($root) {
        $root.find('input').not('[data-field=0]').prop('disabled', true);
    }
    
    function enable($root) {
        $root.find('input').prop('disabled', false);
    }

    function setMessage(msg) {
        if ( msg ) {
            $message.html(msg);
            $message.show();
        } else {
            $message.hide();
        }
    }
    
    function makeTitleInput($root) {
        var $input  = $('<input type="text" style="margin: 0 5px;"></input>'),
            $loader = $('<img src="https://upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif"/>'),
            $indicator = $('<span></span>');

        $loader.hide();
        $input.attr('data-field', 0);
        
        $input.on('focus', function () {
            // Piilotetaan sivulinkki.
            $indicator.html("");
        });
        
        $input.on('blur', function () {
            var $this = $(this),
                title = $this.val();
            
            function success (data) {
                var curPageData = (data && data.query && data.query.pages &&
                                   data.query.pages[Object.keys(data.query.pages) [0]]);
                $loader.hide();
                var $lnk = $('<a></a>');
                $lnk.html(title);
                $indicator.html($lnk);
                
                if ( curPageData.missing !== undefined ) {
                    $lnk.addClass("new");
                    $lnk.attr("href", mw.config.get("wgScript") + "?title=" + title + '&action=edit&redlink=1');
                    $lnk.attr("title", title + " (sivua ei ole)");
                    setMessage(null);
                    enable($root);
                } else {
                    $lnk.attr("href", mw.config.get("wgArticlePath").replace("$1", title));
                    checkedPages[title] = true;
                    if ( mw.loader.getState("ext.gadget.Artikkeliyhdistaja") !== "ready" ) {
                        setMessage(
                            "Sivu on jo olemassa. Kytke asetuksista Artikkeliyhdistäjä-pienoisohjelma "
                            + "päälle, jotta voit lisätä tekstiä olemassa oleville sivuille."
                        );
                        disable($root);
                    } else {
                        setMessage(null);
                        enable($root);
                    }
                }
            }

            if ( title ) {
                $indicator.html($loader);
                if ( checkedPages[title] ) {
                    f_success();
                } else {
                    $loader.show();
                    api.get({
                        action: 'query',
                        format: 'json',
                        prop:   'info',
                        titles: title
                        
                    }).done(success);
                }
            }
        });

        return $('<li></li>').html(['<label style="display: inline-block;">0. Sivu</label>', ' ', $input, ' ', $indicator, '<br/>']);
    }
    
    function makeInput(index) {
        var $input = $('<input type="text" style="width: 100%; margin: 0 5px;"></input>'),
            $label = $('<label style="display: inline-block;"></label>');
        $input.attr('data-field', index);
        return $('<li></li>').html([$label, " ", $input, "<br/>", ]);
    }
    
    function reEvaluate($root) {
        var text = $root.find('.omapohja-preload').val();
        var $textInputs = $root.find('.textInputs');
        var max = 0;
        var result;
        var texts = {};
        var max_text_len = 7;
        texts[0] = "0. Sivu";
        while((result = reg.exec(text)) !== null) {
            texts[result[3]] = texts[result[3]] || (result[3] + ". " + (result[2] || ""));
            max = Math.max(max, result[3]);
            max_text_len = Math.max(max_text_len, (result[2] ? result[2].length : 0));
        }

        
        var top = 10;
        

        
        var index = $textInputs.children().length;
        while ( max >= index ) {
            $textInputs.append(makeInput(index));
            
            top--;
            if ( top <= 0 ) {
                break;
            }
            
            index = $textInputs.children().length;
        }

        $textInputs.find("input").each(function (index) {
            if ( texts[index] !== undefined ) {
                var $label = $(this).prev('label');
                var w = Math.max(max_text_len + 2, 2);
                $label.text(texts[index] ? (" " + texts[index]) : "");
                
                $label.css("width", w + "ex");
                $label.parent().css("padding-left", $label.width() + 60);
                $label.css("margin-left", -$label.width() - 60);
                $(this).parent().show();
            } else {
                $(this).parent().hide();
            }
        });
        
    }
    
    function updateDeleteButtons() {
        if ( $('.omapohja-root').length === 1 ) {
            $('.omapohja-root').find('button:contains(Poista)').hide();
        } else {
            $('.omapohja-root').find('button:contains(Poista)').show();
        }
    }
    
    function init_unit($placeholder, inputValues) {
        var text = $placeholder.text();
        var $root = $('<div class="omapohja-root" style="background-color: linen; margin: 2em 0; padding: 1em; border: solid darkorchid 2px; border-radius: 5px;"></div>');
        var $preloadInput = $('<textarea class="omapohja-preload"></textarea>').val(text);
        var $executeBtn = $('<button>Luo sivu</button>');
        var $copyBtn = $('<button>Monista</button>');
        var $deleteBtn = $('<button>Poista</button>');
        var $textInputs = $('<ul class="textInputs" style="list-style-type: none; padding: 0; margin: 0; white-space: nowrap"></ul>');

        $root.data('original', text);
        $preloadInput.attr('rows', Math.max(text.split("\n").length + 1, 10));
        $root.append($preloadInput);
        $placeholder.replaceWith($root);

        $preloadInput.on('change', function () {
            reEvaluate($root);

            $textInputs.find("input:visible:first").focus();
        });

        $message = $('<div class="omapohja-message" style="background-color: snow; border: solid red 2px; padding: 5px; border-radius: 5px;"></div>');
        $message.hide();
        $root.append($message);
        
        $root.append($textInputs);
        $textInputs.append(makeTitleInput($textInputs));
        
        $executeBtn.on('click', function () {
            var title = $textInputs.find('input[data-field=0]').val();
            var data = JSON.parse(sessionStorage.getItem('omapohja') || '{}');
            data[title] = getFilledText($root);
            
            sessionStorage.setItem('omapohja', JSON.stringify(data));
            open(mw.config.get('wgServer') 
               + mw.config.get('wgScript') 
               + '?title=' + encodeURIComponent(title)
               + '&action=edit', '_blank'
            );
        });
        $root.append($executeBtn);

        $copyBtn.on('click', function () {
            var $copy = $('<pre.lomake></pre>');
            $copy.html($preloadInput.val());
            $root.after($copy);

            var inputValues = [];
            $root.find('input').each(function () { inputValues.push($(this).val()); });
            // Palauttaa pre-elementin pohjalta luodun uuden divin.
            $copy = init_unit($copy, inputValues);
            $copy.hide();
            $copy.slideDown();
            $copy.find('.omapohja-preload').focus();
        });
        
        $deleteBtn.on('click', function () {
            if ( $('.omapohja-root').length < 2 ) {
                alert("Ei voi poistaa viimeistä");
                return;
            }
            if ( $root.data('original') !== $preloadInput.val() ) {
                if ( !confirm("Haluatko varmasti poistaa pohjan?") ) {
                    return;
                }
            }
            $root.detach();
            updateDeleteButtons();
        });
            
        $root.append($('<div style="float: right; padding: 5px;"></div>').append([ $deleteBtn, $copyBtn ]));
        updateDeleteButtons();
        reEvaluate($root);

        if ( inputValues ) {
            $root.find('input').each(function (index) {
                $(this).val(inputValues[index]);
            });
        }
        return $root;
    }


    function init() {
        $placeholders = $('pre.lomake').each(function () {
            init_unit($(this));
        });
    }

    
    if ( mw.config.get('wgAction') === "edit" ) {
        var title = mw.config.get('wgTitle');
    	var data = JSON.parse(sessionStorage.getItem('omapohja') || '{}');
    	if ( !data || !data[title] || window.location.href.includes('&section=') ) {
            //delete data[title];
            sessionStorage.setItem('omapohja', JSON.stringify(data));
            return;
        }
        
        console.log("state:", mw.loader.getState("ext.gadget.Artikkeliyhdistaja"));
        console.log("state:", mw.loader.getState("ext.gadget.SubstitutisSubstituendis"));
        // Jos artikkeliyhdistäjä on astettu päälle.
        if ( data[title].indexOf("{{" + "subst" + ":") > -1 && [ "ready" ].indexOf(mw.loader.getState("ext.gadget.Artikkeliyhdistaja")) > -1 ) {
            
            // Jos substausgadgetti on asetettu päälle.
            if ( [ "ready" ].indexOf(mw.loader.getState("ext.gadget.SubstitutisSubstituendis")) > -1 ) {
                
                $.when(
                    mw.loader.using( 'ext.gadget.Artikkeliyhdistaja' ),
                    mw.loader.using( 'ext.gadget.SubstitutisSubstituendis' )
                ).then(function () {
                    Muokkaussubst.tee_substaukset(
            			mw.config.get('wgPageName'),
                		data[title]
            	    ).done(function (new_text) {
            	    	console.log("saatu", new_text);
						if ( new_text && new_text.parse && new_text.parse.text && new_text.parse.text['*'] ) {
							new_text = new_text.parse.text['*'];
						}
                		articleMerger.mergeToArticle(new_text || data[title]);
                		
        				delete data[title];
        				sessionStorage.setItem('omapohja', JSON.stringify(data));
            	    })
                });

            } else {
            	console.log("Pelkkä yhdistäjä");
                 $.when( mw.loader.using( 'ext.gadget.Artikkeliyhdistaja' ) )
                 .then(function () {
                    articleMerger.mergeToArticle(data[title]);
                    
        			delete data[title];
        			sessionStorage.setItem('omapohja', JSON.stringify(data));
                });
            }
        } else if ( $('#wpTextbox1').val().replace(/\s*/, "") === "" ) {
            $('#wpTextbox1').val(data[title]);
            
        	delete data[title];
        	sessionStorage.setItem('omapohja', JSON.stringify(data));
        } else {
            $.ready(function () {
                setMessage("Yhdistäminen ei onnistunut, mutta laatikossa on teksiä!");
            });
        }
        
    } else {
        init();
    } 
    
});